Re: время жизни временного объекта
От: jazzer Россия Skype: enerjazzer
Дата: 28.06.11 10:39
Оценка: 9 (1)
Здравствуйте, Abyx, Вы писали:

A>есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?


да, все временные объекты разрушаются в конце полного выражения в порядке, обратном их созданию.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
время жизни временного объекта
От: Abyx Россия  
Дата: 28.06.11 10:32
Оценка:
#include <iostream>

struct Foo
{
   Foo() { std::cout << "Foo\n"; }
   operator bool() { return false; }
   ~Foo() { std::cout << "~Foo\n"; }
};

bool f(int x)
{
   std::cout << x << '\n';
   return false;
}

int main()
{
   Foo() || f(1) || f(2);
}


есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?
In Zen We Trust
Re: время жизни временного объекта
От: FlamingWind Россия  
Дата: 28.06.11 10:41
Оценка:
A>есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?

Да, такая гарантия есть. Даже если написать так, гарантия останется:

int main()
{
   Foo(), f(1), f(2);
}


А вот так уже будет другой результат:

int main()
{
   Foo(); f(1), f(2);
}
Re: время жизни временного объекта
От: _niko_ Россия  
Дата: 28.06.11 10:42
Оценка:
Здравствуйте, Abyx, Вы писали:

A>
A>#include <iostream>

A>struct Foo
A>{
A>   Foo() { std::cout << "Foo\n"; }
A>   operator bool() { return false; }
A>   ~Foo() { std::cout << "~Foo\n"; }
A>};

A>bool f(int x)
A>{
A>   std::cout << x << '\n';
A>   return false;
A>}

A>int main()
A>{
A>   Foo() || f(1) || f(2);
A>}
A>


A>есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?


В данной записи: да.

Но тут надо понимать что если Foo::operator bool() вернет true методы f(1) и f(2) вызваны не будут
Соответственно, если Foo::operator bool() вернет false, а f(1) вернет true метод f(2) вызван не будет
Re[2]: время жизни временного объекта
От: SergeySymbol Россия  
Дата: 28.06.11 13:03
Оценка:
Здравствуйте, _niko_, Вы писали:

__>Здравствуйте, Abyx, Вы писали:


A>>
A>>#include <iostream>

A>>struct Foo
A>>{
A>>   Foo() { std::cout << "Foo\n"; }
A>>   operator bool() { return false; }
A>>   ~Foo() { std::cout << "~Foo\n"; }
A>>};

A>>bool f(int x)
A>>{
A>>   std::cout << x << '\n';
A>>   return false;
A>>}

A>>int main()
A>>{
A>>   Foo() || f(1) || f(2);
A>>}
A>>


A>>есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?


__>В данной записи: да.


__>Но тут надо понимать что если Foo::operator bool() вернет true методы f(1) и f(2) вызваны не будут

__>Соответственно, если Foo::operator bool() вернет false, а f(1) вернет true метод f(2) вызван не будет

И еще неприятность в том, что в выражениях неопределен порядок вызова функций (имеется ввиду не в логических выражениях)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.