Создание объекта 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, есть и другие способы избежать такого поведения.

Другие вопросы по тегам