簡體   English   中英

將一個initializer_list分配給std :: array

[英]Assigning a initializer_list to std::array

我試圖將一個initializer_list分配給std :: array,如下所示:

std::array<int,2> arr = {0,1};
arr = {0,1,2};

我立即收到一條錯誤消息,指出操作員=沒有可行的重載

我知道我不能嘗試分配一個大於數組大小的初始化列表,但是我只是想了解std :: array如何做到這一點。

我嘗試瀏覽一下https://code.woboq.org/gcc/libstdc++-v3/include/std/array.html上的代碼,但沒有看到重載的operator =。 那么std :: array如何使用默認的operator =將此類嘗試標記為編譯器錯誤。 默認操作員如何知道如何檢查initializer_list的大小? 請幫助我理解這一點。

如果您仔細閱讀了提供的代碼鏈接,您將在第112行的注釋中看到此內容-

//沒有針對聚合類型的顯式構造/復制/銷毀。

std :: array是一個聚合類型(可以單獨使用其元素),可以像常規數組一樣使用支撐初始化列表進行初始化。

代碼@第109、110行

typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
typename _AT_Type::_Type                         _M_elems;

在堆棧上定義一個常規數組,大小為_Nm,在您的情況下為2。

因此,當您為arr分配一個大括號的初始化程序列表時,該初始化程序列表用於創建一個臨時的std::array<int,2> ,然后使用默認的賦值運算符將其復制到您的數組中。 僅當初始化列表的大小小於或等於2時,此操作才會成功。當您傳遞大小大於2的支撐初始化列表時,由於無法構造std::array<int,2> ,它將被標記為錯誤std::array<int,2>大小大於2的括號列表中的內容。

暫無
暫無

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

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