默认移动构造函数和引用成员

反大象

从N3337的[12.8] [11]中:

非联合类X的隐式定义的复制/移动构造函数执行其基和成员的成员式复制/移动。[注意:非静态数据成员的大括号或相等初始化器将被忽略。另请参见12.6.2中的示例。— —注释[end note]初始化的顺序与用户定义的构造函数中基和成员的初始化的顺序相同(请参见12.6.2)。让我们x将其作为构造函数的参数,或者将其作为移动构造函数的xvalue引用该参数。每个基本或非静态数据成员都按照适合其类型的方式进行复制/移动:

—如果成员是数组,则用x的相应子对象直接初始化每个元素;

—如果成员m具有右值引用类型T &&,则直接用初始化static_cast<T&&>(x.m)

—否则,将使用x的相应基数或成员直接初始化基数或成员。

这确实是一个澄清,但在该子句中我看不到任何有关左值引用成员的内容。由于没有提及它们,因此默认情况下似乎是说它们是隐式成员移动的一部分,但以下操作无效;

int x = 5;
int& y = x;
int& z(std::move(y)); //error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'std::remove_reference<int&>::type {aka int}'

因此可以安全地假设默认的move构造函数可以区分成员是引用,而仅仅是

int& z = y;

没有电话std::move

TC

它由类成员访问表达式的规范处理。关键部分是

让我们x将其作为构造函数的参数,或者将其作为移动构造函数的xvalue引用该参数。

换句话说,默认的move构造函数

struct X { int x, &y; };

相当于

X::X(X&& other) : x(std::move(other).x), y(std::move(other).y) {}

这里重要的是,类成员访问表达式的结果(x.m其中m命名为非静态数据成员)在m具有引用类型的情况下始终为左值,而在x具有右m引用具有非引用类型的情况下为xvalue (请参阅[expr.ref] / 4。)这确保将使用左值初始化左值引用成员。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带互斥成员的默认移动构造函数

来自分类Dev

为什么移动构造函数的成员需要默认构造函数?

来自分类Dev

用户定义的左值引用类型成员的移动构造函数

来自分类Dev

使用反向引用移动多态成员的构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

默认移动构造函数

来自分类Dev

尽管非默认构造函数参数,也会在const引用成员上调用默认构造函数

来自分类Dev

空且默认的构造函数和成员初始化

来自分类Dev

移动构造函数不能默认

来自分类Dev

取消引用新名称时移动语义和构造函数

来自分类Dev

具有移动构造函数和分配的类的默认副本构造函数和分配

来自分类Dev

了解默认移动构造函数定义

来自分类Dev

默认移动构造函数Visual Studio 2015

来自分类Dev

移动构造函数-默认构造函数VS 2013的类型无效

来自分类Dev

用默认构造函数生成的C ++移动构造函数

来自分类Dev

删除默认C ++复制和移动构造函数和赋值运算符的缺点?

来自分类Dev

删除默认C ++复制和移动构造函数和赋值运算符的缺点?

来自分类Dev

循环引用和构造函数

来自分类Dev

C ++ 11实现移动构造函数并移动成员向量

来自分类Dev

不能引用默认构造函数

来自分类Dev

结构中的默认成员值或默认构造函数参数?

来自分类Dev

如何在默认构造函数中初始化对空字符串的类成员引用

来自分类Dev

具有自动默认值和移动构造函数的不可复制类

来自分类Dev

字符串类成员的移动构造函数的行为

来自分类Dev

C ++复制构造函数和默认构造函数

来自分类Dev

用户定义的构造函数和隐式默认构造函数

来自分类Dev

如何为成员变量调用非默认构造函数?

来自分类Dev

具有常量成员的默认构造函数

Related 相关文章

  1. 1

    带互斥成员的默认移动构造函数

  2. 2

    为什么移动构造函数的成员需要默认构造函数?

  3. 3

    用户定义的左值引用类型成员的移动构造函数

  4. 4

    使用反向引用移动多态成员的构造函数

  5. 5

    默认移动构造函数

  6. 6

    默认移动构造函数

  7. 7

    默认移动构造函数

  8. 8

    尽管非默认构造函数参数,也会在const引用成员上调用默认构造函数

  9. 9

    空且默认的构造函数和成员初始化

  10. 10

    移动构造函数不能默认

  11. 11

    取消引用新名称时移动语义和构造函数

  12. 12

    具有移动构造函数和分配的类的默认副本构造函数和分配

  13. 13

    了解默认移动构造函数定义

  14. 14

    默认移动构造函数Visual Studio 2015

  15. 15

    移动构造函数-默认构造函数VS 2013的类型无效

  16. 16

    用默认构造函数生成的C ++移动构造函数

  17. 17

    删除默认C ++复制和移动构造函数和赋值运算符的缺点?

  18. 18

    删除默认C ++复制和移动构造函数和赋值运算符的缺点?

  19. 19

    循环引用和构造函数

  20. 20

    C ++ 11实现移动构造函数并移动成员向量

  21. 21

    不能引用默认构造函数

  22. 22

    结构中的默认成员值或默认构造函数参数?

  23. 23

    如何在默认构造函数中初始化对空字符串的类成员引用

  24. 24

    具有自动默认值和移动构造函数的不可复制类

  25. 25

    字符串类成员的移动构造函数的行为

  26. 26

    C ++复制构造函数和默认构造函数

  27. 27

    用户定义的构造函数和隐式默认构造函数

  28. 28

    如何为成员变量调用非默认构造函数?

  29. 29

    具有常量成员的默认构造函数

热门标签

归档