gpt4 book ai didi

c++ - 为什么在调用 std::vector::emplace_back() 时调用复制构造函数?

转载 作者:IT老高 更新时间:2023-10-28 13:01:15 37 4
gpt4 key购买 nike

据我了解,std::vector::emplace_back() 的目的是专门避免调用复制构造函数,而是直接构造对象。

考虑以下代码:

#include <memory>
#include <vector>
#include <boost/filesystem.hpp>

using namespace std;

struct stuff
{
unique_ptr<int> dummy_ptr;
boost::filesystem::path dummy_path;
stuff(unique_ptr<int> && dummy_ptr_,
boost::filesystem::path const & dummy_path_)
: dummy_ptr(std::move(dummy_ptr_))
, dummy_path(dummy_path_)
{}
};

int main(int argc, const char * argv[])
{

vector<stuff> myvec;

// Do not pass an object of type "stuff" to the "emplace_back()" function.
// ... Instead, pass **arguments** that would be passed
// ... to "stuff"'s constructor,
// ... and expect the "stuff" object to be constructed directly in-place,
// ... using the constructor that takes those arguments
myvec.emplace_back(unique_ptr<int>(new int(12)), boost::filesystem::path());

}

由于某种原因,尽管使用了 emplace_back() 函数,但这段代码编译失败,报错:

error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' [...] This diagnostic occurred in the compiler generated function 'stuff::stuff(const stuff &)'

请注意,编译器尝试创建(和使用)COPY CONSTRUCTOR。正如我上面所讨论的,我的理解是 emplace_back()目的避免使用复制构造函数。

当然,由于编译器正在尝试创建和调用 copy 构造函数,因此代码无法编译 即使我为 stuff 定义了复制构造函数,因为 std::unique_ptr 不能在复制构造函数中使用。因此,我非常想避免使用复制构造函数(事实上,我需要避免它)。

(这是 Windows 7 64 位上的 VS 11.0.60610.01 Update 3)

为什么编译器会生成并尝试使用复制构造函数,即使我调用的是 emplace_back()


注意(回应@Yakk 的回答):

显式添加move构造函数,如下解决问题:

stuff(stuff && rhs)
: dummy_ptr(std::move(rhs.dummy_ptr))
, dummy_path(rhs.dummy_path)
{}

最佳答案

Visual Studio 2013 及更早版本无法为您编写默认移动构造函数。向 stuff 添加一个简单的显式移动构造函数。

如果需要重新分配,则推送或放回可能会导致移动内容,在您的情况下复制,因为 stuff 没有移动。

这是一个 msvc 错误。

关于c++ - 为什么在调用 std::vector::emplace_back() 时调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595079/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com