[英]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
EmplaceConstructible
到X
對於vector
,T
也應該是MoveInsertable
到X
您的A
MoveInsertable
要求,因為您沒有移動構造函數,並且只有一個已刪除的復制構造函數。 使用除std::vector
之外的容器, 它可以工作 。
與增加向量大小的其他函數一樣, emplace_back
有條件地重新分配向量(如果當前容量不夠大)。 如果它這樣做,那么它需要將舊數組中的現有元素轉換為新數組。
您的類沒有移動構造函數(某些類具有編譯器生成的移動,但不是因為您刪除了復制構造函數)。 因此重新分配代碼需要能夠復制類型,而不能。
當然,對於這個調用,沒有要復制的舊元素,但是emplace_back
函數無法實例化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.