C++/Initializer list
<initializer_list> 是w:C++標準程式庫中的一個w:頭文件,定義了w:C++標準中一個非常輕量級的表示初始化器列表的類模板initializer_list及有關函數。
類模板initializer_list
[編輯]類模板initializer_list用於訪問初始化列表(initialization list),列表元素的數據類型為const T。編譯器從花括號(brace)封閉的,元素由逗號分隔開的初始化列表自動構造initializer_list模板類。例如:
auto il = { 10, 20, 30 }; // the type of il is an initializer_list<int>
這些元素形成一個基礎性的列表(underlying list),類模板initializer_list引用(refer to)但不包含這個列表的元素。複製這個initializer_list對象將引用到同一個基礎列表而不是引用到基礎列表的新的拷貝(引用語義reference semantics)。std::initializer_list並不是一個容器,不要用它傳遞期望長期存續的值。
構造函數的形參如果為一個initializer_list模板類,則這種特殊的構造函數稱為初始化器列表構造函數(initializer-list constructor)。
struct myclass { myclass (int,int); myclass (initializer_list<int>); /* definitions ... */ }; myclass foo {10,20}; // calls initializer_list ctor myclass bar (10,20); // calls first constructor
注意,僅可以從braced-init-list推導出initializer_list<T>。這一過程中,編譯器自動查詢哪些構造函數可以用initializer_list<T>作為參數,並據此確定initializer_list的模板參數T的類型,從而對braced-init-list做類型轉換,例如把字符串書面量"Hello world!"轉換為string類,然後生成initializer_list<string>,最後再調用初始化器列表構造函數。C++標準規定禁止把初始化值窄化(narrow)以符合變量初始化所需的類型。例如:
int i {3.14}; //编译错误
C++11標準明確規定不能由模板參數推導出對應實參std::initializer_list的類型。[1]例如:
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
成員類型
[編輯]- value_type :模板參數(T)
- reference :const T&
- const_reference :const T&
- size_type :size_t
- iterator :const T*
- const_iterator :const T*
成員函數
[編輯]- (constructor) :構造一個空的initializer_list
- size :返回list的大小
- begin :返回開始處的迭代器
- end :返回末端的迭代器
其他函數(模板)
[編輯]- begin (initializer_list) :返回開始處的迭代器
- end (initializer_list) :返回末端的迭代器
參考文獻
[編輯]頁面Template:ReflistH/styles.css沒有內容。
- ↑ § 14.8.2.5/5 of the C++11 standard explicitly states that this is a non-deduced context for a template argument: A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.