为什么使用move构造函数而不是copy



为什么调用移动构造函数而不是复制构造函数?当我移除move构造函数时,就会调用copy构造函数。

使用:-fno elide构造函数来避免复制省略

#include <iostream>
class test
{
public:
int x;
char y;
bool t;
test()
{
std::cout << " constructed" << std::endl;
}
test(test &&temp)
{
std::cout << "move constructor" << std::endl;
}
test(const test &temp)
{
std::cout << "copy constructor" << std::endl;
}
template <typename... Args>
static test create(Args... x)
{
test b(x...);
return b;
}
};
int main()
{
test z = test::create();
test v = test();
}

输出:

constructed
move constructor
move constructor
constructed
move constructor

出现上述情况的原因是什么?

来源https://en.cppreference.com/w/cpp/language/return#Automatic_move_from_local_variables_and_parameters,主要是NRVO:的回退

然后执行两次重载解析以选择用于初始化返回值[..]的构造函数:

  • 首先,就好像表达式是一个右值表达式一样(因此它可以选择move构造函数(,并且如果第一次过载解决失败,或者

[…]

因此,当复制/移动未被消除时,return b;将执行移动构造函数(如果可用(。

对于test v = test();test()是一个右值,在C++17之前,将使用move构造函数(如果未被省略((如果可用(。

在C++17中,甚至不会创建临时的,这将避免移动构造函数(主要是对于复制/移动省略版本,除了复制/移动不必是可访问的(。

如果移除移动构造函数,则在提供复制构造函数时,不会生成移动构造函数,并且只有复制构造函数可用,并用于代替移动构造函数。

我认为这是基本的移动语义。将临时变量分配给非临时变量时,只要存在移动运算符(默认或指定使用(,就会使用该运算符。看看克劳斯·伊格尔伯格的演讲。我想那是2019年的cppcon。-抱歉。我的意思是回复而不是回答

相关内容

  • 没有找到相关文章

最新更新