理解复制对象

Understanding copying objects

本文关键字:对象 复制      更新时间:2023-10-16

我写的是:

#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-构造函数调用,但输出是:

default ctor
20
演示

A a = init();

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

A a;

此处不使用move构造函数。

此处的move构造函数可以与-fno-elide-constructors编译器标志一起使用。我已经修改了您的示例,以便使用此标志进行编译。但是请注意,默认构造函数将始终被调用,因为NRVO在代码中不会影响它。NRVO只意味着对象将在它需要的存储中构造(而不是在init方法的堆栈上),因此它不会被移动或复制。如果使用no-elide标记,则不能在那里创建它,因此它将被复制/移动到那里。