簡體   English   中英

為什么大小不是std :: initializer_list的模板參數?

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

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