【问题标题】:Assignment operator and a temporary [duplicate]赋值运算符和临时[重复]
【发布时间】:2015-01-22 13:43:46
【问题描述】:

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

【问题讨论】:

  • 最新的带有高警告的VS应该对此发出警告。

标签: c++ visual-studio-2012


【解决方案1】:

之所以可行,是因为启用了语言扩展的 VC++ 不符合标准,并且允许将非 const 左值引用绑定到临时对象。

foo中添加默认构造函数后,both GCC and Clang issue an appropriate error message

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

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

main.cpp:6:10: 注意:候选函数不可行:需要一个左值 第一个论点

foo& operator=(foo&)
     ^

【讨论】:

  • 而且 VC++ 在禁用语言扩展时也会发出错误。
  • 感谢您解决这个问题
  • @hvd 很高兴知道。实际上不要使用 VS :o)
猜你喜欢
  • 2011-11-16
  • 2017-11-21
  • 2014-07-18
  • 2011-03-13
  • 2014-08-25
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多