C++ 11使得基于引用限定符重载成员函数成为可能:
class Foo {
public:
  void f() &;   // for when *this is an lvalue
  void f() &&;  // for when *this is an rvalue
};
Foo obj;
obj.f();               // calls lvalue overload
std::move(obj).f();    // calls rvalue overload
我理解这是如何工作的,但它的用例是什么?
我看到N2819建议将标准库中的大多数赋值运算符限制为左值目标(即向赋值运算符添加" &"引用限定符),但这被拒绝了.所以这是一个潜在的用例,委员会决定不再使用它.那么,再一次,什么是合理的用例?
如果T是具有赋值运算符的默认签名的类类型,那么我们可以编写:
T const &ref = ( T{} = something ); 
这创造了一个悬垂的参考.但是,签名:
T &operator=(T t) &
带有悬空引用的上述代码将无法编译.这可以防止我们返回指定临时对象的左值的一些情况 - 不良情况,因为它们可能导致悬空引用.
有没有理由不这样做; 我们是否会禁用赋值运算符的任何有效用例?
我认为相同的注释也可以应用于复合赋值运算符+=等.更现实的情况可能是:
std::string const &s = std::string("Hello, ") += "world!";
在运行时UB之前,拼写错误会被忽视.