Странное поведение компилятора C++ застало меня врасплох сегодня.
class Foo {
friend ostream& operator << (ostream& os, const Foo& rhs)
{
return os << sizeof(rhs) << endl;
}
};
struct Bar { };
int main()
{
Foo f(Bar());
cout << f;
return 0;
}
Очевидно, что код выше скомпилирован, даже если не было
Foo(const Bar&);
c'tor. Компиляция с -Wall показала, что компилятор интерпретирует выражение
Foo f(Bar());
как прототип функции
Foo f(Bar (*)())
вместо выражения для создания объекта типа Foo.
Что на самом деле является уловкой (правилом) здесь?
Foo f(Bar());
Здесь предполагается, что компилятор должен быть вызовом функции в результате C++ "наиболее неприятного разбора".
То, что вы можете сделать, это просто добавить еще одну скобку вокруг вашего объекта.
Foo f((Bar()));
Если вы видите документацию C++ 11, существует больше способов избежать такого поведения.