[英]Why doesn't this use of emplace_back with deleted copy constructor work?
[英]Why does vector<T>::emplace_back, such that T has a deleted copy constructor, fail to compile?
我無法編譯以下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
要求std::vector::emplace_back
的類型為EmplaceConstructible
以及MoveInsertable
。 由於您刪除了復制構造函數並且沒有自己定義移動構造函數,因此Thing
不滿足第二個要求。 相反, std::list::emplace_back
只要求列表類型為EmplaceConstructible
。
它有移動構造函數時有效:
#include <vector>
class Thing {
public:
Thing() {}
Thing(const Thing &) = delete;
Thing(Thing&&) = default;
};
int main() {
std::vector<Thing> v;
v.emplace_back();
return 0;
}
std::vector::emplace_back
的類型要求可以提供更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.