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建议将标准库中的大多数赋值运算符限制为左值目标(即添加“&
“引用限定符赋值运算符),但是这被拒绝了。因此,这是一个潜在的用例,委员会决定不采用它。那么,再一次,什么是合理的用例?
在提供引用获取器的类中,引用限定符重载可以在从右值提取时激活移动语义。例如。:
class some_class {
huge_heavy_class hhc;
public:
huge_heavy_class& get() & {
return hhc;
}
huge_heavy_class const& get() const& {
return hhc;
}
huge_heavy_class&& get() && {
return std::move(hhc);
}
};
some_class factory();
auto hhc = factory().get();
这看起来确实需要花费很多精力才能获得更短的语法
auto hhc = factory().get();
具有相同的效果
auto hhc = std::move(factory().get());
编辑:我找到了原始提案文件,它提供了三个激励示例:
- 约束
operator =
到左值(TemplateRex 的答案)
- 为成员启用移动(基本上是这个答案)
- 约束
operator &
到左值。我认为这是明智的,以确保当“指针”最终取消引用时“被指向者”更有可能还活着:
struct S {
T operator &() &;
};
int main() {
S foo;
auto p1 = &foo; // Ok
auto p2 = &S(); // Error
}
不能说我曾经亲自使用过operator&
超载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)