我目前正在使用VS2012并期望此代码中的语句B失败,因为我们将一个常量temp传递给foo类中的赋值运算符方法。令人惊讶的是,为什么会这样?声明A失败,没关系。为什么声明B没有失败?
struct foo
{
int a;
foo& operator=(foo& that)
{
a=12;
return *this;
}
};
int main()
{
const foo a;
foo b;
//b = a; //statement A
b = foo(); //Statement B
}
答案 0 :(得分:4)
这是有效的,因为启用了语言扩展的VC ++不符合标准,并允许将非常量左值引用绑定到临时。
在foo
,both GCC and Clang issue an appropriate error message中添加默认构造函数后:
main.cpp:18:7:错误:没有可行的重载' ='
b = foo(); //Statement B ~ ^ ~~~~~
main.cpp:6:10:注意:候选函数不可行:期望l值 第一个参数
foo& operator=(foo&) ^