簡體   English   中英

為什么矢量 <T> :: \\ templace_back,這樣T有一個刪除的拷貝構造函數,無法編譯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM