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&
过重载。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句