C ++对象创建或函数原型声明

时间:2014-11-14 10:09:34

标签: c++ gcc

奇怪的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类型对象的表达式。

这里的捕获(规则)究竟是什么?

1 个答案:

答案 0 :(得分:1)

Foo f(Bar());

这里的编译器假设是一个函数调用,因为C ++是“最令人烦恼的解析”。

你可以做的只是在你的对象周围加上一个括号。

Foo f((Bar()));

如果你看到C ++ 11文档,有更多方法可以避免这种行为。