c++ 如何避免重载赋值运算符将右值转换为左值?

据我所知,返回*这是编写重载operator =的标准.但这可能会提升一个左派的价值!

struct Foo {
  Foo& operator=(const Foo &t) { return *this; }
};

int main() {
  const Foo &ref = Foo();
  //Foo &ref1 = Foo();  // This line won't compile.
  //But the following line compiles. Isn't it dangerous?
  //Also please note that if = is not overloaded, the synthesized operator= will NOT let it compile.
  Foo &ref2 = (Foo() = Foo());

  return 0;
}
最佳答案
你是对的.简单的答案是这是合法的,但是由于你指出的原因是危险的.

另一个(类似的)例子被添加到C11,作为标准的一部分,使用rvalue流输出,它返回一个左值引用.

template <class charT, class traits, class T>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& os, const T& x);

so std :: ostream& s = std :: ofstream(“foo.txt”)<< “好家伙”;是合法的,但产生了悬而未决的参考. 我相信C11编译器将允许成员函数被限制在对象是一个左值的情况下,这应该允许你根除所有问题.以下只允许在*这是一个左值的分配,所以它阻止你意外转换.

struct Foo {
  Foo& operator=(const Foo &t) & { return *this; }
};

转载注明原文:c++ 如何避免重载赋值运算符将右值转换为左值? - 代码日志