[英]Does std::initializer_list have a copy constructor and is it ever used?
std :: initializer_list是否具有復制構造函數,如果確實有,是否曾經使用過?在哪種情況下? 因為我注意到以下內容無法在GCC中編譯:
std::initializer_list<int>{{1,2,3,4}};
而下面的一個
class Test{
public:
Test(const std::initializer_list<int> &){}
};
Test{{1,2,3,4,5,6}};
所以我懷疑std :: initializer_list <int>是否具有Test類具有的構造函數,第一段代碼將進行編譯
所以我懷疑std :: initializer_list <int>是否具有Test類具有的構造函數,第一段代碼將進行編譯
那會假設“統一初始化”實際上是統一的 ,這總是一個危險的假設。
initializer_list
具有關於從braced-init-list構造的特殊規則。 如果將braced -init-list應用於initializer_list<T>
,則[dcl.init.list] /3.5會加入,表示“在下面”,跳過其余子項。 並且“在下面”說 :
類型
std::initializer_list<E>
的對象是從初始化列表構造的,就好像實現生成並實現了“N
const E
數組”類型的prvalue,其中N
是初始化列表中元素的數量。
好吧,您是從單個元素構造自己的initializer_list<int>
,它本身就是一個支撐初始列表。 現在,該braced-init-list應用於E
,即int
。 而且由於該列表包含多個條目,因此不起作用。
因為3.5項明確地跳過了該節中的所有其他子項,所以內部的braced-init-list是否可以創建initializer_list<int>
並不重要 。 編譯器從不進行檢查,因為這樣做是在3.6中進行的 ,已被跳過。
作為記錄, initializer_list
確實具有(默認)復制/移動構造函數和賦值運算符。
根據cppreference ,唯一可用的構造函數是默認構造函數。
這可能與通常的實現方式有關:一個標准的C樣式數組。 有關更多信息,我建議在CppCon2018上來自Jason Turner的這段視頻提供有關生命周期的見解。
但是,您可以初始化一個容器與initializer_list
有效地把它當作其“復制”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.