在 C++ 中,不能依赖从 return 语句调用的复制构造函数,因为标准中的一个特殊子句允许编译器忽略对由 return 语句产生的复制构造函数的调用,即使复制构造函数有副作用。因此,编写一个除了复制构造实例之外做其他事情的复制构造函数是不好的风格。
C++11 标准中是否有类似的语句允许编译器在某些情况下消除对移动构造函数的调用 - 如果是这样,那些情况是什么?
在 C++ 中,不能依赖从 return 语句调用的复制构造函数,因为标准中的一个特殊子句允许编译器忽略对由 return 语句产生的复制构造函数的调用,即使复制构造函数有副作用。因此,编写一个除了复制构造实例之外做其他事情的复制构造函数是不好的风格。
C++11 标准中是否有类似的语句允许编译器在某些情况下消除对移动构造函数的调用 - 如果是这样,那些情况是什么?
复制省略同样适用于移动构造,它是完全相同的子句,复制构造的省略和移动构造的省略统称为“复制省略”。
§12.8 [class.copy] p31
当满足某些条件时,允许实现省略类对象的复制/移动构造,即使对象的复制/移动构造函数和/或析构函数具有副作用。[...]
当允许复制省略时,不会执行复制,因此不会调用移动复制构造函数,即使对象是可移动的。因此,复制省略胜过移动,您无法确定(至少不是以可移植的方式)它何时会发生。因此,这是对移动复制构造产生副作用的一种情况,这是一个坏主意。
复制和移动的省略定义相同。该标准没有任何具体的移动措辞,因为它们的定义相同。