【发布时间】:2013-02-17 21:18:06
【问题描述】:
编译器隐式生成的移动构造函数和移动赋值运算符是如何实现的?
编译器是使用带有统一operator= 的复制和交换习惯用法(具有强大的异常安全保证),还是实现了成员明智的移动?
【问题讨论】:
标签: c++ c++11 move-semantics
编译器隐式生成的移动构造函数和移动赋值运算符是如何实现的?
编译器是使用带有统一operator= 的复制和交换习惯用法(具有强大的异常安全保证),还是实现了成员明智的移动?
【问题讨论】:
标签: c++ c++11 move-semantics
这是一个成员移动,就像隐式定义的复制操作执行成员复制一样。参见 12.8 [class.copy] 第 15 和 25 段。
对于不可复制类型或不可交换类型,无法进行复制和交换,您不希望移动操作依赖于可能不存在的另一个特殊成员或 swap 成员或可能无法按要求工作。
【讨论】:
编译器是使用带有统一 operator= 的复制和交换习惯用法(具有强大的异常安全保证),还是实现了成员明智的移动?
根据 C++11 标准的第 12.8/15 段:
非联合类 X 的隐式定义的复制/移动构造函数执行其基类和成员的成员复制/移动。 [...]
此外,根据第 12.8/28 段:
非联合类 X 的隐式定义的复制/移动赋值运算符执行 按成员复制- /move 分配其子对象。 [...]
【讨论】: