赋值运算符和临时运算符

Assignment operator and a temporary

本文关键字:运算符 赋值运算符      更新时间:2023-10-16

我目前正在使用 VS2012,并且预计此代码中的语句 B 会失败,因为我们正在向 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
}

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

foo 中添加默认构造函数后,GCC 和 Clang 都会发出相应的错误消息:

主.cpp:18:7:错误:没有可行的重载"="

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

主.cpp:6:10:注意:候选函数不可行:期望 L 值 对于第一个参数

foo& operator=(foo&)
     ^