gpt4 book ai didi

c++ - 如何调用移动构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:45 25 4
gpt4 key购买 nike

我有以下代码:

#include<iostream>
using namespace std;
class A{
int size;
double *arr;

public:
A(int len):size(len)
{
cout<<"ctor called"<<endl;
arr=new double[size];
}
A(const A &rhs)
{
cout<<"calling copy ctor"<<endl;
size=rhs.size;
arr=new double[size];
}
A(A&& rhs)
{
cout<<"caling move constructor"<<endl;
size=rhs.size;
arr=rhs.arr;
rhs.arr=nullptr;
}
~A()
{
cout<<"Calling Dtor"<<endl;
delete[] arr;
size=0;
arr=NULL;
}
};
A createVector()
{
cout<<"Creating object"<<endl;
A a(20);
cout<<"returning after creating object a"<<endl;
return (a);
}
void foo(A v)
{
cout<<"Class A object rcvd"<<endl;
return;
}
int main()
{
//cout<<"a has been rcvd"<<endl;
foo(createVector());
return 0;
}

我传递了一个类型为“A”的临时对象(已由另一个函数返回)。我期待调用 Move 构造函数。但我得到以下输出:

Creating object
ctor called
returning after creating object a
Class A object rcvd
Calling Dtor

为什么没有调用 Move Constructor?另外,如果更改代码如下:

foo(createVector())----->foo(move(createVector()));

我得到以下输出:

Creating object
ctor called
returning after creating object a
caling move constructor
Class A object rcvd
Calling Dtor
Calling Dtor

为什么会调用两次析构函数??

最佳答案

Why there is no call to Move Constructor??

没有调用移动构造函数,因为移动已经被优化掉了。当 createVector 创建其 A 对象时,它不会在通常用于局部变量的位置创建对象。相反,该对象是在返回值的通常位置创建的。此返回值转到 main 为其指定的位置,即其“'A' 类型的临时对象”。由于这个临时值是按值传递给另一个函数的,因此它是在通常用于此类参数的地方构造的。

因此,当createVector 创建其名为aA 对象时,a 的位置已经是正确的main 传递给 foo 的位置,不需要移动(除非您明确请求移动)。麾!你的编译器是高效的!忽略它并继续关注更重要的问题。 (如果这不仅仅是为了理解移动语义,那么您可能正在编写糟糕的代码。)

Why there is a call to Destructor two times??

因为你强制两个对象存在。在这种情况下,createVector 返回的临时对象被强制放置在与用作 foo 参数的对象不同的位置。两者都需要销毁。 (从一个对象中移出可能会使该对象处于不可用状态,但它仍然是一个需要销毁的对象。不可用状态确实需要足够连贯,以便析构函数能够处理。)

关于c++ - 如何调用移动构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51337901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com