c++11 初始化列表

标准模板库中容器对初始化列表的支持源自<initializer_list>这个头文件中initialize_list类模板的支持。程序员只要#include了<initializer_list>头文件,并且声明一个以initialize_list<T>模板类为参数的构造函数,同样可以使得自定义的类使用列表初始化。

在C++11中,列表初始化是唯一一种可以防止类型收窄的初始化方式。

列表初始化改变了C++中对类型初始化的一些基本模式,将标准程序库跟语言拉得更近了。这样的做法有效地统一了内置类型和自定义类型的行为。这也是C++11设计所遵循的一个思想,即通用为本,专用为末。

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新特性解析与应用》

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 即,以大括号形式给某容器对象初始化,如下图所示: 这种形式的初始化之所以行得通,是因为C++11中的容器的构造函数...
    Stroman阅读 6,197评论 0 1
  • 1、在给结构体赋值的时候,可以使用一对大括号来进行赋值,赋值过程中会按照结构体成员顺序来进行赋值; 初始化的类型是...
    Sky_Mao阅读 3,772评论 0 0
  • 1 初始化列表 C++98/03中可以使用初始化列表对普通数组、POD类型等进行初始化。如: 但是这种初始化方式的...
    georgeguo阅读 5,229评论 0 1
  • C++11新增了列表初始化的概念。 在C++11中可以直接在变量名后面加上初始化列表来进行对象的初始化。 列表初始...
    this_is_for_u阅读 3,315评论 0 0
  • 3.5.1 初始化列表 C++98中,可以使用"{}"对数组元素进行统一的集合初始值设定,如 而在C++11中可以...
    zinclee123阅读 2,801评论 0 0