相关疑难解决方法(0)

在引用限定符上重载成员函数的用例是什么?

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
Run Code Online (Sandbox Code Playgroud)

我理解这是如何工作的,但它的用例是什么?

我看到N2819建议将标准库中的大多数赋值运算符限制为左值目标(即向赋值运算符添加" &"引用限定符),但这被拒绝了.所以这是一个潜在的用例,委员会决定不再使用它.那么,再一次,什么是合理的用例?

c++ overloading qualifiers rvalue-reference c++11

24
推荐指数
2
解决办法
3131
查看次数

它是否提高了将赋值运算符标记为仅限左值的安全性?

如果T是具有赋值运算符的默认签名的类类型,那么我们可以编写:

T const &ref = ( T{} = something ); 
Run Code Online (Sandbox Code Playgroud)

这创造了一个悬垂的参考.但是,签名:

T &operator=(T t) &
Run Code Online (Sandbox Code Playgroud)

带有悬空引用的上述代码将无法编译.这可以防止我们返回指定临时对象的左值的一些情况 - 不良情况,因为它们可能导致悬空引用.

有没有理由不这样做; 我们是否会禁用赋值运算符的任何有效用例?

我认为相同的注释也可以应用于复合赋值运算符+=等.更现实的情况可能是:

std::string const &s = std::string("Hello, ") += "world!";
Run Code Online (Sandbox Code Playgroud)

在运行时UB之前,拼写错误会被忽视.

c++ operator-overloading assignment-operator c++11

11
推荐指数
1
解决办法
300
查看次数