iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++std::initializer_list实现原理解析及遇到问题
  • 504
分享到

C++std::initializer_list实现原理解析及遇到问题

2024-04-02 19:04:59 504人浏览 安东尼
摘要

 一般而言,对变量或对象使用括号初始化的方式被称为直接初始化,其本质是调用了相应的构造函数;而使用等号初始化的方式则被称为拷贝初始化,说到拷贝大家可能马上就会想到拷贝构造函

 一般而言,对变量或对象使用括号初始化的方式被称为直接初始化,其本质是调用了相应的构造函数;而使用等号初始化的方式则被称为拷贝初始化,说到拷贝大家可能马上就会想到拷贝构造函数、operator =()函数,但此时并不一定是调用了这两个函数,这点极容易混淆!!!

今天正在看侯捷《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) { }
      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::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

到此这篇关于C++ std::initializer_list 实现原理勘误的文章就介绍到这了,更多相关C++ std::initializer_list 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++std::initializer_list实现原理解析及遇到问题

本文链接: https://www.lsjlt.com/news/138120.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作