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

知道全部

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());

编辑:我找到了原始的投标文件,它提供了三个激励性的例子:

  1. 约束operator =到左值(TemplateRex的答案)
  2. 允许成员移动(基本上是此答案)
  3. 约束operator &为左值。我认为这样做可以确保“指针”最终被取消引用时,“指针”更有可能存活:
struct S {
  T operator &() &;
};

int main() {
  S foo;
  auto p1 = &foo;  // Ok
  auto p2 = &S();  // Error
}

不能说我曾经亲自使用operator&过重载。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

函数的引用限定符是否有实际用例?

来自分类Dev

const和引用成员函数限定符

来自分类Dev

转发引用,引用限定符和模板成员函数

来自分类Dev

为什么不允许仅在一个引用限定符上进行重载?

来自分类Dev

是什么在C const限定符和C ++中的const限定符之间的区别?

来自分类Dev

正确支持STL中成员函数的volatile限定符

来自分类Dev

ref限定符`const &&`的用途是什么?

来自分类Dev

用&&和const限定符重载operator ==会导致C ++ 20中的歧义

来自分类Dev

复制构造函数错误:对象具有与成员函数不兼容的类型限定符

来自分类Dev

C ++为什么在定义重载和参考函数时每个函数都应有一个参考限定符

来自分类Dev

我可以用吗 。作为 gnu c 结构中的成员限定符

来自分类Dev

重载==运算符导致丢弃限定符错误

来自分类Dev

重载==运算符导致丢弃限定符错误

来自分类Dev

该对象具有与成员函数C ++不兼容的类型限定符

来自分类Dev

对象具有与成员函数不兼容的类型限定符

来自分类Dev

该对象具有与成员函数C ++不兼容的类型限定符

来自分类Dev

= delete方法上的限定符

来自分类Dev

什么是OSGI版本限定符

来自分类常见问题

Powershell分配中的双嵌套类型限定符是什么意思?

来自分类Dev

OpenCL中的常量地址空间限定符是什么?

来自分类Dev

用参数中的最终限定符覆盖的函数中的方法签名

来自分类Dev

此运算符重载函数重载是什么?

来自分类Dev

脱机定义成员函数时,哪些限定符必须出现在声明/定义/两者中?

来自分类Dev

引用与类型丢弃限定符的值的绑定

来自分类Dev

为什么尽管有const限定符声明,嵌套结构成员仍会更改?

来自分类Dev

从函数类型中剥离所有限定符

来自分类Dev

从VBA中的子调用函数-限定符错误

来自分类Dev

模板化类const限定符构造函数

Related 相关文章

  1. 1

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

  2. 2

    函数的引用限定符是否有实际用例?

  3. 3

    const和引用成员函数限定符

  4. 4

    转发引用,引用限定符和模板成员函数

  5. 5

    为什么不允许仅在一个引用限定符上进行重载?

  6. 6

    是什么在C const限定符和C ++中的const限定符之间的区别?

  7. 7

    正确支持STL中成员函数的volatile限定符

  8. 8

    ref限定符`const &&`的用途是什么?

  9. 9

    用&&和const限定符重载operator ==会导致C ++ 20中的歧义

  10. 10

    复制构造函数错误:对象具有与成员函数不兼容的类型限定符

  11. 11

    C ++为什么在定义重载和参考函数时每个函数都应有一个参考限定符

  12. 12

    我可以用吗 。作为 gnu c 结构中的成员限定符

  13. 13

    重载==运算符导致丢弃限定符错误

  14. 14

    重载==运算符导致丢弃限定符错误

  15. 15

    该对象具有与成员函数C ++不兼容的类型限定符

  16. 16

    对象具有与成员函数不兼容的类型限定符

  17. 17

    该对象具有与成员函数C ++不兼容的类型限定符

  18. 18

    = delete方法上的限定符

  19. 19

    什么是OSGI版本限定符

  20. 20

    Powershell分配中的双嵌套类型限定符是什么意思?

  21. 21

    OpenCL中的常量地址空间限定符是什么?

  22. 22

    用参数中的最终限定符覆盖的函数中的方法签名

  23. 23

    此运算符重载函数重载是什么?

  24. 24

    脱机定义成员函数时,哪些限定符必须出现在声明/定义/两者中?

  25. 25

    引用与类型丢弃限定符的值的绑定

  26. 26

    为什么尽管有const限定符声明,嵌套结构成员仍会更改?

  27. 27

    从函数类型中剥离所有限定符

  28. 28

    从VBA中的子调用函数-限定符错误

  29. 29

    模板化类const限定符构造函数

热门标签

归档