gpt4 book ai didi

c++ - 未调用移动构造函数

转载 作者:太空宇宙 更新时间:2023-11-04 14:58:08 24 4
gpt4 key购买 nike

我是不是又做错了什么?

#include <iostream>
using std::cout;

struct Map
{
Map()
{
cout << "Map()\n";
}
Map(const Map& pattern)
{
cout << "Map(const Map& pattern)\n";
}
Map(Map&& tmp)
{
cout << "Map(Map&& tmp)\n";
}
};

Map createMap()
{
return Map();
}

int main(int argc, char* argv[])
{
//dflt
Map m;
//cpy
Map m1(m);
//move
Map m2(Map(m1));//<<I thought that I create here tmp unnamed obj.
Map m3(createMap());//<<---or at least here, but nope...
return 0;
}

请看代码中的注释行

已编辑 [摘自 FredOverflow 答案]

int main() 
{
std::cout << "default\n";
Map m;

std::cout << "\ncopy\n";
Map m1(m);

std::cout << "\nmove\n";
Map m2((Map(m1)));

std::cout << "\nmove\n";
Map m3(createMap());
}

我得到输出:

default
Map()

copy
Map(const Map& pattern)

move
Map(const Map& pattern)//Here why not move ctor aswell as copy?

move
Map()
Map()
Map(Map&& tmp)

最佳答案

Map m3(createMap());//<<---or at least here, but nope...

您正在见证返回值优化的实际应用。在 C++ 中,允许编译器优化复制返回对象,并让函数直接与存储结果的调用者对象一起工作。也不需要调用移动构造函数。

使函数更复杂,使编译器无法使用优化,您将看到移动在起作用。例如:

Map createMap()
{
Map a, b;
if (rand())
return a;
return b;
}

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

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