了解复制对象

时间:2015-07-15 09:07:32

标签: c++ copy

我写了这个:

#include <iostream>

struct A
{
    int a;
    int b;
    A() : a(10) { std::cout << "default ctor" << std::endl;}
    ~A(){ }
    A(const A&){ std::cout << "copy ctor" << std::endl; }
    A(const A&&){ std::cout << "move ctor" << std::endl; }
};

A init()
{
    A a;
    a.b = 20;
    return a;
}

int main()
{
    A a = init();
    std::cout << a.b << std::endl;
}

我预计A a = init()强制执行move-contructor调用,但outpur是:

default ctor

20

DEMO

1 个答案:

答案 0 :(得分:1)

该行

A a = init();

NRVO内联。它通过在其代码段中使用它的默认构造函数来创建对象:

A a;

此处不会使用您的移动构造函数。

此处的移动构造函数可以与-fno-elide-constructors编译器标志一起使用。我用modified your example用这个标志编译它。但请注意,将始终调用默认构造函数,因为NRVO不会影响您的代码。 NRVO仅表示对象将在需要的存储中构建(而不是在init方法的堆栈上),因此不会移动或复制它。使用no-elide标志,它不能在那里创建,因此它将被复制/移动到那里。