有趣的!我什至没有意识到这一点,花了我一段时间才找到它(这是“将移动语义扩展到 *this”提案的一部分)。该符号在 8.3.5 [dcl.decl] 第 4 段中定义,以防有人想查看。
无论如何:现在,了解此功能似乎最有用的是使用它进行重载,并且如果调用函数的对象是左值或右值,则可能表现不同。用它来限制可以做什么,例如,赋值的结果似乎没有必要,特别是如果对象实际上是一个左值。例如,您可能希望语法从分配给一个右值返回一个右值:
struct T {
auto operator=(T&) & -> T&;
auto operator=(T&&) & -> T&;
auto operator=(T&) && -> T;
auto operator=(T&&) && -> T;
};
这里的目的是允许从分配结果中移动(尽管这是否值得,但我不确定:为什么不首先跳过分配?)。我认为我不会主要使用此功能来限制使用。
就个人而言,我喜欢有时从右值中获取左值的可能性,而赋值运算符通常是实现此目的的一种方式。例如,如果您需要将一个左值传递给一个函数,但您知道您不想对它使用任何东西,您可以使用赋值运算符获取一个左值:
#include <vector>
void f(std::vector<int>&);
int main()
{
f(std::vector<int>() = std::vector<int>(10));
}
这可能是对赋值运算符从右值获取左值的滥用,但这不太可能是偶然发生的。因此,我不会特意通过将赋值运算符限制为仅适用于左值来使这成为不可能。当然,从赋值中返回一个右值也可以防止这种情况发生。如果有的话,这两种用途中哪一种更有用,可能是一个考虑因素。
顺便说一句,clang 似乎支持您从 2.9 版开始引用的语法。