2009-08-21 49 views
9

处理this问题,我发现一个不一致的行为。const引用绑定到右值

为什么引用绑定在构造函数中的行为与通用函数不同?

struct A { 
}; 

struct B : public A { 
    B(){} 
private: 
    B(const B&); 
}; 

void f(const B& b) {} 

int main() { 
    A a(B()); // works 
    A const & a2 = B(); // C++0x: works, C++03: fails 
    f(B()); // C++0x: works, C++03: fails 
} 

我测试用于C++ 03与克++ - 4.1和科莫4.2.45.2严格C++ 03模式和禁用的C++ 0x扩展。我得到了同样的结果。

对于C++而言,使用g ++ 4.4和Comeau 4.3.9在放宽模式下启用了C++ 0x扩展,对其进行了测试。我得到了同样的结果。

回答

16
A a(B()); 

是函数的命名为返回一个A和采取指针的函数,但没有参数返回B.见 here声明。 加上括号,你会得到你期望的错误:

A a((B())); 
+7

着名的“最令人头痛的解析”。 – earl 2009-08-21 08:47:04

+0

我不能等待那天我可以对某人说“你是最令人头痛的解析问题的受害者”。当然,到那时候,我会完全忘记它,并回到讨厌C++。 – 2010-01-25 20:55:45

相关问题