C++ std::initializer_list 实现原理勘误

Posted mkckr0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ std::initializer_list 实现原理勘误相关的知识,希望对你有一定的参考价值。

今天正在看侯捷《C++ 新标准 C++11-14》的视频,里面讲到 std::initializer_list 的实现原理,并且把源码贴出来。

  /// 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(); 
    ;

他认为,构造 std::initializer_list 之前编译器会先构造一个 std::array,然后使用 std::arraybegin()size() 构造 std::initializer_list。这种说法有一处错误。编译器不会构造 std::array,而是在栈上直接构造一个数组 const T[N]。在栈上构造的数组会像其他变量一样,在离开作用域时自动析构,不需要手动管理内存,所以根本没必要使用 std::array

这个是 cppreference.com 的描述:

The underlying array is a temporary array of type const T[N]

明确地说是普通的 array

这个是 N3337 的描述:

An object of type initializer_list<E> provides access to an array of objects of type const E.

并没有说是 std::array

本文来自博客园,作者:mkckr0,转载请注明原文链接:https://www.cnblogs.com/mkckr0/p/15858919.html

以上是关于C++ std::initializer_list 实现原理勘误的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual C++ 编译器中使用 std::initializer_list 2012 年 11 月 CTP

使用 std::initializer_list 创建指向 std::min 的函数指针

为啥 `std::initializer_list` 不提供下标运算符?

为啥 std::min(std::initializer_list<T>) 按值接受参数?

为啥 std::initializer_list 不是内置语言?

std::initializer_list 作为函数参数