现在 GCC 4.8.1 和 Clang 2.9 及更高版本支持它们,引用限定符(也称为“*this 的右值引用”)变得更加广泛可用。它们允许类的行为更像内置类型,例如,不允许分配给右值(否则会导致不需要的右值强制转换为左值):
class A
{
// ...
public:
A& operator=(A const& o) &
{
// ...
return *this;
}
};
通常,调用const
右值的成员函数是明智的,因此左值引用限定符将不合适(除非右值限定符可用于优化,例如将成员移出类而不是返回副本)。
另一方面,可变运算符(例如预减/增量运算符)应该是左值限定的,因为它们通常返回对对象的左值引用。const
因此还有一个问题:除了概念上const
的方法之外,是否有任何理由允许在右值引用上调用变异/非方法(包括运算符),const
因为 const 正确性(包括mutable
在使用内部缓存时的正确应用) ,其中可能包括现在确保某些线程安全保证)在代码库中被忽略了?
澄清一下,我并不是建议在语言级别禁止对右值进行变异方法(至少这可能会破坏遗留代码),但我相信默认(作为一种习惯用法/编码风格)只允许左值用于变异方法通常会导致更清洁、更安全的 API。但是,我对不这样做会导致更清洁、更不令人惊讶的API 的示例感兴趣。