Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么调用移动构造函数而不是复制构造函数_C++_C++11 - Fatal编程技术网

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。