跳至內容

C++/Initializer list

維基教科書,自由的教學讀本
< C++

<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沒有內容。

  1. § 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.