gpt4 book ai didi

c++ - 为什么 vector::emplace_back 使 T 具有已删除的复制构造函数,但编译失败?

转载 作者:太空狗 更新时间:2023-10-29 23:35:10 32 4
gpt4 key购买 nike

我无法编译以下 dont_compile 函数。我不明白为什么它不起作用。但是,它确实适用于 list

class Thing {
public:
Thing() {}
Thing(const Thing &) = delete;
};

int dont_compile(int argc, char ** argv)
{
std::vector<Thing> v;
v.emplace_back();

return 0;
}

int compiles(int argc, char ** argv)
{
std::list<Thing> v;
v.emplace_back();

return 0;
}

这是编译器的错误。是错误吗?

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1752:31: error: call to deleted constructor of 'Thing'
::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

... snip ...

note: 'Thing' has been explicitly marked deleted here
Thing(const Thing &) = delete;

我真的不明白 _Up(...) 是如何导致调用复制构造函数的。

最佳答案

std::vector::emplace_back 要求 vector 类型为 EmplaceConstructible 以及 MoveInsertable。由于您删除了复制构造函数并且没有自己定义移动构造函数,因此 Thing 不满足第二个要求。相比之下,std::list::emplace_back 仅要求列表类型为 EmplaceConstructible

关于c++ - 为什么 vector<T>::emplace_back 使 T 具有已删除的复制构造函数,但编译失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44862962/

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