为什么不调用move-constructor?

时间:2013-06-01 12:37:11

标签: c++ c++11

为什么在此示例中没有打印任何内容?我在Coliru的Clang编译。

#include <iostream>

struct S
{
    S()    noexcept = default;
    S(S&&) noexcept { std::cout << "move-ctor"; }
};

void f(S) {}

int main()
{
    f(S{});
}

1 个答案:

答案 0 :(得分:11)

编译器正在执行 copy elision ,即使你的移动构造函数,复制构造函数或析构函数有副作用,也允许按照C ++ 11 Standard的12.8 / 31段进行操作:

  

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

即使移动被取消,也会使用 copy elision 一词:

  

在以下情况下允许复制/移动操作的省略,称为复制省略 (其中   可以合并以消除多个副本):

     

[...]

     

- 当复制/移动尚未绑定到引用(12.2)的临时类对象时   对于具有相同cv-unqualified类型的类对象,可以省略复制/移动操作   将临时对象直接构造到省略的复制/移动

的目标中      

[...]

使用GCC,您可以使用-fno-elide-constructors来禁止复制省略。在这种情况下,您将看到移动构造函数被调用,如此live example