AI智能
改变未来

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

今天正在看侯捷《C++ 新标准 C++11-14》的视频,里面讲到

std::initializer_list

的实现原理,并且把源码贴出来。

/// initializer_listtemplate<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_typesize() const noexcept { return _M_len; }// First element.constexpr const_iteratorbegin() const noexcept { return _M_array; }// One past the last element.constexpr const_iteratorend() const noexcept { return begin() + size(); }};

他认为,构造

std::initializer_list

之前编译器会先构造一个

std::array

,然后使用

std::array

begin()

size()

构造

std::initializer_list

。这种说法有一处错误。编译器不会构造

std::array

,而是在栈上直接构造一个数组

const T

。在栈上构造的数组会像其他变量一样,在离开作用域时自动析构,不需要手动管理内存。

std::array

也是如此,它仅在其基础之上做了一层包装,使数组的行为如同其它容器一样。所以根本没必要使用

std::array

,直接使用数组就足够了。

这个是 cppreference.com 的描述:

The underlying array is a temporary array of type

const T

明确地说是普通的

array

这个是 N3337 的描述:

An object of type

initializer_list<E>

provides access to an array of objects of type

const E

.

并没有说是

std::array

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » C++ std::initializer_list 实现原理勘误