c++11 初始化列表

標準模板庫中容器對初始化列表的支持源自<initializer_list>這個頭文件中initialize_list類模板的支持肺孵。程序員只要#include了<initializer_list>頭文件,并且聲明一個以initialize_list<T>模板類為參數(shù)的構(gòu)造函數(shù)谱煤,同樣可以使得自定義的類使用列表初始化。

在C++11中骆姐,列表初始化是唯一一種可以防止類型收窄的初始化方式偶器。

列表初始化改變了C++中對類型初始化的一些基本模式,將標準程序庫跟語言拉得更近了脑题。這樣的做法有效地統(tǒng)一了內(nèi)置類型和自定義類型的行為件缸。這也是C++11設(shè)計所遵循的一個思想,即通用為本叔遂,專用為末他炊。

std::initializer_list

initializer_list objects are automatically constructed as if an array of elements of type T was allocated, with each of the elements in the list being copy-initialized to its corresponding element in the array, using any necessary non-narrowing implicit conversions.

  /// initializer_list
  template<class _E>
    class initializer_list
    {
    public:
      typedef _E        value_type;
      typedef const _E&     reference;
      typedef const _E&     const_reference;
      typedef size_t        size_type;
      typedef const _E*     iterator;
      typedef const _E*     const_iterator;

    private:
      iterator          _M_array;
      size_type         _M_len;

      // The compiler can call a private constructor.
      constexpr initializer_list(const_iterator __a, size_type __l)
      : _M_array(__a), _M_len(__l) { }

    public:
      constexpr initializer_list() noexcept
      : _M_array(0), _M_len(0) { }

      // Number of elements.
      constexpr size_type
      size() const noexcept { return _M_len; }

      // First element.
      constexpr const_iterator
      begin() const noexcept { return _M_array; }

      // One past the last element.
      constexpr const_iterator
      end() const noexcept { return begin() + size(); }
    };

  /**
   *  @brief  Return an iterator pointing to the first element of
   *          the initializer_list.
   *  @param  __ils  Initializer list.
   */
  template<class _Tp>
    constexpr const _Tp*
    begin(initializer_list<_Tp> __ils) noexcept
    { return __ils.begin(); }

  /**
   *  @brief  Return an iterator pointing to one past the last element
   *          of the initializer_list.
   *  @param  __ils  Initializer list.
   */
  template<class _Tp>
    constexpr const _Tp*
    end(initializer_list<_Tp> __ils) noexcept
    { return __ils.end(); }
}

使用initializer_list的實例

/**
   *  @brief  Set value to string constructed from initializer %list.
   *  @param  __l  std::initializer_list.
   */
  basic_string&
  operator=(initializer_list<_CharT> __l)
  {
    this->assign(__l.begin(), __l.size());
    return *this;
  }

參考:
stl源碼
《深入理解C++11:C++11新特性解析與應(yīng)用》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末争剿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佑稠,更是在濱河造成了極大的恐慌秒梅,老刑警劉巖旗芬,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舌胶,死亡現(xiàn)場離奇詭異,居然都是意外死亡疮丛,警方通過查閱死者的電腦和手機幔嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來誊薄,“玉大人履恩,你說我怎么就攤上這事∧啬瑁” “怎么了切心?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長片吊。 經(jīng)常有香客問我绽昏,道長,這世上最難降的妖魔是什么俏脊? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任全谤,我火速辦了婚禮,結(jié)果婚禮上爷贫,老公的妹妹穿的比我還像新娘认然。我一直安慰自己,他們只是感情好漫萄,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布卷员。 她就那樣靜靜地躺著,像睡著了一般腾务。 火紅的嫁衣襯著肌膚如雪毕骡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天窑睁,我揣著相機與錄音挺峡,去河邊找鬼。 笑死担钮,一個胖子當著我的面吹牛橱赠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箫津,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼狭姨,長吁一口氣:“原來是場噩夢啊……” “哼宰啦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饼拍,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赡模,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后师抄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓柑,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年叨吮,在試婚紗的時候發(fā)現(xiàn)自己被綠了辆布。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡茶鉴,死狀恐怖锋玲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涵叮,我是刑警寧澤惭蹂,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站割粮,受9級特大地震影響盾碗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜穆刻,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一置尔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氢伟,春花似錦榜轿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诚些,卻和暖如春飞傀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诬烹。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工砸烦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绞吁。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓幢痘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親家破。 傳聞我的和親對象是個殘疾皇子颜说,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 即购岗,以大括號形式給某容器對象初始化,如下圖所示: 這種形式的初始化之所以行得通门粪,是因為C++11中的容器的構(gòu)造函數(shù)...
    Stroman閱讀 1,997評論 0 1
  • 1喊积、在給結(jié)構(gòu)體賦值的時候,可以使用一對大括號來進行賦值玄妈,賦值過程中會按照結(jié)構(gòu)體成員順序來進行賦值乾吻; 初始化的類型是...
    Sky_Mao閱讀 579評論 0 0
  • 1 初始化列表 C++98/03中可以使用初始化列表對普通數(shù)組、POD類型等進行初始化措近。如: 但是這種初始化方式的...
    georgeguo閱讀 1,384評論 0 1
  • C++11新增了列表初始化的概念溶弟。 在C++11中可以直接在變量名后面加上初始化列表來進行對象的初始化女淑。 列表初始...
    this_is_for_u閱讀 445評論 0 0
  • 3.5.1 初始化列表 C++98中瞭郑,可以使用"{}"對數(shù)組元素進行統(tǒng)一的集合初始值設(shè)定,如 而在C++11中可以...
    zinclee123閱讀 332評論 0 0