不能 push_back() 不可复制的对象到矢量引用 C++

Cant push_back() non copyable object to vector reference C++

我在处理一小段代码时遇到了一些问题,这让我有点困惑。我目前正在做一个速度很重要的项目,因此我选择了 c++。

我正在尝试通过引用将向量传递给函数。向量的类型为 unique_ptr<int>,我想在向量上调用 push_back() 以向其添加元素。当我将指针传递给 push_back() 时,我已经确保我在指针上调用 move() 但由于某种原因我收到编译器错误告诉我:

static assertion failed: result type must be constructible from value type of input range

只有当我按引用而不是按值传递矢量时才会发生这种情况。我可以按值传递矢量,但我想尽可能避免不必要的复制。尝试将可复制对象添加到按值或引用传递的向量时似乎不会发生此错误。

我正在使用 g++ 9.3.0 进行编译。

这里有一个重现错误的小片段,感谢您的帮助。

#include <vector>
#include <memory>

using namespace std;

void appendToVectorVal(vector<unique_ptr<int>> vectorVal){
    unique_ptr<int> toPush = make_unique<int>(1);
    vectorVal.push_back(move(toPush)); // does compile
}

void appendToVectorRef(vector<unique_ptr<int>>& vectorRef){
    unique_ptr<int> toPush = make_unique<int>(1);
    vectorRef.push_back(move(toPush)); // doesnt compile
}

int main() {
    vector<unique_ptr<int>> ptrVector;
    appendToVectorVal(ptrVector);
    appendToVectorRef(ptrVector);
    return 0;
}

此代码段编译失败仅仅是因为您将 unique_ptr 的向量按值传递给 appendToVectorVal 函数。按值传递向量意味着调用 std::vector 的复制构造函数,它调用向量包含的每个元素的构造函数。但是std::unique_ptr的拷贝构造函数被删除了

事实上,以下代码片段编译成功:

#include <vector>
#include <memory>

using namespace std;

void appendToVectorRef(vector<unique_ptr<int>>& vectorRef){
    unique_ptr<int> toPush = make_unique<int>(1);
    vectorRef.push_back(move(toPush));
}

int main() {
    vector<unique_ptr<int>> ptrVector;
    appendToVectorRef(ptrVector);
    return 0;
}

对移动的对象应用push_back是有效的。它调用 void push_back( T&& value ); 版本(在 C++20 中用 constexpr 限定),它只需要 T 即可移动构造。