赋值运算符和临时运算符

时间:2014-11-24 18:30:53

标签: c++ visual-studio-2012

我目前正在使用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
}

1 个答案:

答案 0 :(得分:4)

这是有效的,因为启用了语言扩展的VC ++不符合标准,并允许将非常量左值引用绑定到临时。

fooboth GCC and Clang issue an appropriate error message中添加默认构造函数后:

  

main.cpp:18:7:错误:没有可行的重载' ='

  b = foo();    //Statement B
  ~ ^ ~~~~~
     

main.cpp:6:10:注意:候选函数不可行:期望l值   第一个参数

foo& operator=(foo&)
     ^