c++ - 为什么调用复制构造函数而不是 move 构造函数?

标签 c++ c++11 copy-constructor move-semantics move-constructor

我有以下代码:

#include <bits/stdc++.h>

using namespace std;

class A {
public:
    A(const A& a) noexcept { cout << "copy constructor" << endl; }
    A& operator=(const A& a) noexcept { cout << "copy assignment operator" << endl; }
    A(A&& a) noexcept { cout << "move constructor" << endl; }
    A& operator=(A&& a) noexcept { cout << "move assignment operator" << endl; }
    A() { cout << "default constructor" << endl; }
};

vector<A> aList;

void AddData(const A&& a)
{
    aList.push_back(std::move(a));
}

int main()
{
    AddData(A());
    return 0;
}
输出为 default constructor copy constructor .请告诉我是右值引用push_back(T&&)叫?什么时候调用复制构造函数?

最佳答案

问题在于 a AddData() 中的参数:

void AddData(const A&& a) // <-- const reference!!!
{
    aList.push_back(std::move(a)); // selects push_back(const A&)
}
a上面的参数是 const 右值引用。您正在使用 std::move() 进行标记一个 const目的。
标记 const带有 std::move() 的对象对于 move 语义而言, move 没有任何影响,因为您不能从 const move 。对象(即,您需要更改移出对象,但它是 const -qualified)。
右值引用不绑定(bind)到 const对象,而是一个 const左值引用确实如此。因此,push_back(const A&)选择重载而不是 push_back(A&&)一个,因此 A对象是复制构造的。

解决方案
使用非 const右值引用代替:
void AddData(A&& a) // <-- non-const reference
{
    aList.push_back(std::move(a)); // selects push_back(A&&)
}

关于c++ - 为什么调用复制构造函数而不是 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62634487/

相关文章:

c++ - 如何从用户那里获取多个数字并将偶数加在一起并乘以奇数?

c++ - 如何检查 CMakeLists.txt 文件中是否定义了某些内容

c++ - std::cin 在 do-while 循环中不起作用

c++ - 为什么我们需要为 lambda 中的引用捕获引用?

两个派生类的 C++ 拷贝

c++ - 双向链表的复制构造函数(C++)

C++模板类编译错误

c++必须删除引用吗?

c++ - nullptr_t 未在 g++ 4.9.2 上定义

java - 复制包含另一个对象的父类(super class)的对象