一般而言,对变量或对象使用括号初始化的方式被称为直接初始化,其本质是调用了相应的构造函数;而使用等号初始化的方式则被称为拷贝初始化,说到拷贝大家可能马上就会想到拷贝构造函数、operator =()函数,但此时并不一定是调用了这两个函数,这点极容易混淆!!!
今天正在看侯捷《c++ 新标准 c++11-14》的视频,里面讲到 std::initializer_list
的实现原理,并且把源码贴出来。
/// initializer_list template<class _e> class 考试大initializer_list { p全国十大旅游景点ublic:成长的烦恼作文400字 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) { } 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. 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
。
到此这篇关于c++ std::initializer_list 实现原理勘误的文章就介绍到这了,更多相关c++ std::initializer_list 内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 21:27:13,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9f041540812a437aeec26b2b7e105fc7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C++ std::initializer.doc
本文 PDF 下载地址:C++ std::initializer.pdf
留言与评论(共有 0 条评论) |