[英]Why is the size not a template argument of std::initializer_list?
std::initializer_list
由編譯器從一個用大括號括起來的init列表構造,並且此列表的大小必須是編譯時間常數。
那么,委員會為什么決定忽略模板參數的大小呢? 這可能會阻止一些優化並使某些事情變得不可能(從std::initializer_list
初始化std::array
)。
如果initializer_list
定義為std::initializer_list<type, size>
,則任何采用initializer_list<type>
( type
是某種具體類型)的函數現在都必須是基於列表大小的模板函數。 否則,他們將需要用戶傳遞特定類型和大小的initializer_list
。
這兩個都是不可接受的。 並非所有人都將所有代碼都寫為模板。
您可以從括號初始化列表( {}
,中間有東西)初始化std::array
。 但這與std::intiializer_list
。 array
類是聚合類型。 它是一個包含單個元素的結構,該元素是一個公共數組。 因此,在符合標准的C ++ 11實現中,應編譯為:
std::array<int, 3> myArray = {1, 3, 5};
但是, {1, 3, 5}
不是std::initializer_list
對象; 它只是一個braced-init-list,可用於初始化適當的類型。
您不能將std::initializer_list
對象傳遞給aggegate的構造函數(因為集合沒有構造函數),但是您可以使用braced-init-list調用集合初始化來初始化std::array
,就像對包含數組的任何結構。
std::initializer_list
和braced-init-list之間的區別有點像int
和立即數0
之間的區別。 (通常)將int
對象隱式轉換為指針類型是不合法的,但是將整數常量0隱式轉換為指針類型是合法的。 括號初始化列表的工作方式如下:
int i = 0; //Legal
void *j = 0; //Legal
void *k = i; //Not legal
std::array<int, 3> myArray = {1, 3, 5}; //Legal
std::initializer_list<int> myInitList = {1, 3, 5}; //Legal
std::array<int, 3> myArray = myInitList; //Not legal
現有系統的一個好處是,您可以導出從DLL中獲取initializer_list
函數。 如果按大小模板化,則必須將它們作為源發貨。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.