簡體   English   中英

std :: initializer_list是否具有復制構造函數,是否曾經使用過?

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

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