Создание объекта C ++ или объявление прототипа функции

0

Странное поведение компилятора 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.

Что на самом деле является уловкой (правилом) здесь?

Теги:
gcc

1 ответ

1
Лучший ответ
Foo f(Bar());

Здесь предполагается, что компилятор должен быть вызовом функции в результате C++ "наиболее неприятного разбора".

То, что вы можете сделать, это просто добавить еще одну скобку вокруг вашего объекта.

Foo f((Bar()));

Если вы видите документацию C++ 11, существует больше способов избежать такого поведения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню