奇怪的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类型对象的表达式。
这里的捕获(规则)究竟是什么?
答案 0 :(得分:1)
Foo f(Bar());
这里的编译器假设是一个函数调用,因为C ++是“最令人烦恼的解析”。
你可以做的只是在你的对象周围加上一个括号。
Foo f((Bar()));
如果你看到C ++ 11文档,有更多方法可以避免这种行为。