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::array
的 begin()
和 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 typeconst 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>) 按值接受参数?