C++ 为什么调用移动构造函数而不是复制构造函数
我想了解一个移动构造器 通常在复制对象时调用复制构造函数 如果我不提供移动构造函数 但当我添加一个移动构造函数时,会调用它而不是复制构造函数 这是我的密码:C++ 为什么调用移动构造函数而不是复制构造函数,c++,c++11,C++,C++11,我想了解一个移动构造器 通常在复制对象时调用复制构造函数 如果我不提供移动构造函数 但当我添加一个移动构造函数时,会调用它而不是复制构造函数 这是我的密码: #include <iostream> #include <vector> using namespace std; struct A { A() { cout << "A's constructor" << endl; } A(const
#include <iostream>
#include <vector>
using namespace std;
struct A
{
A()
{
cout << "A's constructor" << endl;
}
A(const A& rhs)
{
cout << "A's copy constructor" << endl;
}
A(A&& rhs)
{
cout << "A's move constructor" << endl;
}
};
int main() {
vector<A> v;
cout << "==> push_back A():";
v.push_back(A());
cout << "==> push_back A():" << endl;
v.push_back(A());
return 0;
}
编译器是否尝试优化我的代码并选择更好的方法?基本上,是的
然而,这不是关于编译器优化,而是关于语言本身是如何优化的
移动语义的一半要点是允许有效地使用临时变量。这就是为什么临时变量绑定到右值引用,这就是整个移动语义的工作原理。当您没有临时值但仍希望移动某些内容时,可以编写std::move来获取一个右值并触发相同的行为
不管怎样,当这些临时机构即将被摧毁时,复制它们是没有意义的
与复制/移动省略配合使用,此功能将大大减少冗余计算
然而,请注意,您的移动构造函数并不是非常有用-如果您想让它实际执行诸如移动之类的操作,您必须删除该常量。与常量左值引用相比,右值引用更适合绑定临时对象。它不是关于编译器优化中的优化,而是关于遵循标准。实际的优化是根本不调用复制构造函数。考虑一下move构造函数的名称,看看它的实现。它将参数作为常量右值引用。如何从常量值移动?好的,所以我们不能从常量值引用移动,我已更新了代码。@linuxD您的意思是在上一次编辑中从复制构造函数中删除常量吗?我删除了常量限定符yes@linuxD我评论的目的是提请你注意一个可能的错误。复制构造函数的惯用签名采用const引用,即您应该只从move构造函数中删除const。