Создание объекта C++ или объявление прототипа функции
Странное поведение компилятора 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&);
не могу определить. Компиляция с -Wall показала, что компилятор интерпретирует выражение
Foo f(Bar());
в качестве прототипа для функции
Foo f(Bar (*)())
вместо выражения для создания объекта типа Foo.
Что на самом деле здесь подвох (правило)?
1 ответ
Решение
Foo f(Bar());
Здесь компилятор предполагает, что это должен быть вызов функции в результате C++ "самого неприятного анализа".
Что вы можете сделать, это просто поставить еще одну скобку вокруг вашего объекта.
Foo f((Bar()));
Если вы видите документацию C++11, есть и другие способы избежать такого поведения.