在C ++中,不能依赖从return语句调用的复制构造函数,因为标准中的一个特殊子句允许编译器省略对由return语句产生的复制构造函数的调用,即使复制构造函数具有副作用。因此,编写复制构造函数不仅仅是复制构造实例,这是一种糟糕的风格。
在C ++ 11标准中是否有类似的语句允许编译器在某些情况下消除对移动构造函数的调用 - 如果是,那么这些情况是什么?
答案 0 :(得分:9)
Copy-elision适用于移动构造,它是完全相同的条款,复制构造和移动构造的省略统称为“复制省略”。
§12.8 [class.copy] p31
当满足某些条件时,允许实现省略类对象的复制/ 移动构造,即使复制/ 移动构造函数和/或析构函数也是如此对象有副作用。 [...]
答案 1 :(得分:3)
当允许复制省略时,不会执行复制,因此即使对象是可移动的,也不会调用移动复制构造函数。所以复制elision胜过移动,你不能确定它(至少不是以便携方式)何时发生。所以这是一个场景,当移动副本构造的副作用是一个坏主意。
答案 2 :(得分:1)
Elision的定义与复制和移动相同。标准没有任何特定的移动措辞,因为它们的定义相同。