【问题标题】:C++11 move constructor with side effects具有副作用的 C++11 移动构造函数
【发布时间】:2012-08-01 06:16:32
【问题描述】:

在 C++ 中,不能依赖从 return 语句调用的复制构造函数,因为标准中的一个特殊子句允许编译器忽略对由 return 语句产生的复制构造函数的调用,即使复制构造函数具有副作用。因此,编写一个复制构造函数来做其他事情而不只是复制构造实例是不好的风格。

C++11 标准中是否有类似的语句允许编译器在某些情况下消除对移动构造函数的调用 - 如果有,这些情况是什么?

【问题讨论】:

  • 谢谢。问题得到了充分的回答。今天学到了很多!第一个(几秒钟)是@Xeo。那将是正确的答案。所有答案 +1

标签: c++ c++11 move-semantics move-constructor


【解决方案1】:

复制省略同样适用于移动构造,它是完全相同的子句,复制构造的省略和移动构造的省略统称为“复制省略”。

§12.8 [class.copy] p31

当满足某些条件时,允许实现省略类对象的复制/移动构造,即使复制/移动构造函数和/或析构函数也是如此因为对象有副作用。 [...]

【讨论】:

    【解决方案2】:

    当允许复制省略时,不会执行复制,因此不会调用移动复制构造函数,即使对象是可移动的。因此,复制省略胜过移动,您无法确定(至少不是以可移植的方式)何时会发生。因此,这是对移动复制构造产生副作用的一种情况。

    【讨论】:

      【解决方案3】:

      对于复制和移动,省略的定义相同。该标准没有任何具体的移动措辞,因为它们的定义相同。

      【讨论】:

        猜你喜欢
        • 2018-01-23
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 2012-10-17
        • 1970-01-01
        相关资源
        最近更新 更多