了解调用哪个构造函数

时间:2017-01-26 14:37:07

标签: c++ c++11 move c++17

我有一个存储int:

的结构
struct foo {
    int value;

    foo(int value) : value(value) {
        std::cout << "value constr\n";
    }

    foo(foo const&) {
        std::cout << "copy constr\n";
    }

    foo(foo&&) {
        std::cout << "move constr\n";
    }
};

在主要方法中,我执行以下操作:

foo bar = foo(foo(foo(42)));

此时我希望首先调用通常的构造函数,然后多次移动构造函数,因为参数将是一个rvalue。但是,输出只是&#34;值constr&#34;。

为什么不调用复制或移动构造函数以及在此示例中实际发生了什么?

1 个答案:

答案 0 :(得分:3)

由于Copy elision,将调用适当的构造函数直接构造对象,将省略复制/移动构造函数。从C ++ 17开始,这种行为就得到了保证。

  

在下列情况下,编制者需要省略   类对象的复制和移动构造函数,即使复制/移动也是如此   构造函数和析构函数具有可观察到的副作用:

     
      
  • 在初始化中,如果初始化表达式是prvalue,并且源类型的cv-nonqualified版本与   目的地的类,初始化表达式用于   初始化目标对象:

    T x = T(T(T())); // only one call to default constructor of T, to initialize x
    
  •