簡體   English   中英

std :: vector emplace_back()用於非復制可構造對象

[英]std::vector emplace_back() for non copy constructible objects

考慮en.cppreference.com關於std::vector::emplace_back

“將一個新元素追加到容器的末尾。該元素就地構造,即不執行復制或移動操作。使用提供給函數的完全相同的參數調用元素的構造函數。”

以下樣本:

#include <vector>
struct A
{
    A(int){}
    A(A const&) = delete;
};

int main()
{
    std::vector<A> vec;
    vec.emplace_back(1);

    return 0;
}

在線vec.emplace_back(1); Visual Studio 2013 / GCC報告:

錯誤C2280:'A :: A(const A&)':嘗試引用已刪除的函數

錯誤:使用已刪除的函數'A :: A(const A&)'

錯誤是否正確? 你能解釋一下為什么嗎?

C ++ 11 23.2.1表101說明:

表達式: a.emplace_back(args)

返回類型: void

操作語義:追加使用std::forward<Args>(args)...構造的T類型的對象。 要求: T應該是來自args EmplaceConstructibleX 對於vectorT也應該是MoveInsertableX

您的A MoveInsertable要求,因為您沒有移動構造函數,並且只有一個已刪除的復制構造函數。 使用除std::vector之外的容器, 它可以工作

與增加向量大小的其他函數一樣, emplace_back有條件地重新分配向量(如果當前容量不夠大)。 如果它這樣做,那么它需要將舊數組中的現有元素轉換為新數組。

您的類沒有移動構造函數(某些類具有編譯器生成的移動,但不是因為您刪除了復制構造函數)。 因此重新分配代碼需要能夠復制類型,而不能。

當然,對於這個調用,沒有要復制的舊元素,但是emplace_back函數無法實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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