#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) ?
A>есть ли гарантия что ~Foo() всегда будет вызываться после f(1) и f(2) ?
Да, такая гарантия есть. Даже если написать так, гарантия останется:
int main()
{
Foo(), f(1), f(2);
}
А вот так уже будет другой результат:
int main()
{
Foo(); f(1), f(2);
}
Здравствуйте, 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) вызван не будет
Здравствуйте, _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) вызван не будет
И еще неприятность в том, что в выражениях неопределен порядок вызова функций (имеется ввиду не в логических выражениях)