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 也是如此,它仅在其基础之上做了一层包装,使数组的行为如同其它容器一样。所以根本没必要使用 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
构造时直接使用初始化列表 T object { arg1, arg2, ... }; (1) T { arg1, arg2, ... } (2) new T { arg1, arg2, ... } ( ...
- std::move的原理与实现,右值引用的深入理解
这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用 ...
- C++11:基于std::queue和std::mutex构建一个线程安全的队列
C++11:基于std::queue和std::mutex构建一个线程安全的队列 C++中的模板std::queue提供了一个队列容器,但这个容器并不是线程安全的,如果在多线程环境下使用队列,它是不能 ...
- C++雾中风景16:std::make_index_sequence, 来试一试新的黑魔法吧
C++14在标准库里添加了一个很有意思的元函数: std::integer_sequence.并且通过它衍生出了一系列的帮助模板: std::make_integer_sequence, std::m ...
- C++11 std::function用法
转自 http://www.hankcs.com/program/cpp/c11-std-function-usage.html function可以将普通函数,lambda表达式和函数对象类统一起来 ...
- C++11中新特性之:initializer_list详解
C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用 ...
- STL初始化initializer_list
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h&g ...
- Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_s ...
- initializer_list 列表初始化
initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数. #include <iostrea ...
- 第7课 列表初始化(2)_分析initializer_list<T>的实现
1. 初始化列表的实现 (1)当编译器看到{t1,t2…tn}时便会生成一个initializer_list<T>对象(其中的T为元素的类型),它关联到一个array<T,n> ...
随机推荐
- 2023年的PHP项目部署笔记。什么?还有人用PHP?
前言 这是我第一次用 PHP 的包管理工具 composer 一开始用 docker 进行部署,但一直出问题,最后还是选择直接在服务器上安装 php-fpm 搭配 nginx 的方案了. PS:doc ...
- Feign远程调用超时问题
1.问题概述 上图的场景,每次重启项目后openFeign都会报一个超时异常,异常信息如下 2.为什么会产生这个异常? 当项目刚启动时,数据库连接池的中的连接并不会创建;第一次请求的时候才会初始化各种 ...
- LeetCode331:验证二叉树的前序序列化(递归)
解题思路:把所有元素存成数组,设置一个全局下标next,表示当前节点如果要继续遍历应当从数组的哪个位置开始,然后从下标 0 开始DFS.如果DFS返回真并且next下标等于数组的长度,说明元素已经全部 ...
- oracle12c静默安装
oracle12c 静默安装 先决条件 ● 至少 1 GB RAM 用于 Oracle 数据库安装.建议使用 2 GB 内存. ● 至少 8 GB RAM 用于 Oracle Grid Infrast ...
- 华企盾DSC控制台升级提示不能连接服务器
由于服务器Apache没有启动导致无法升级,查看版本说明看看是否是版本问题,尝试手动启动Apache服务
- 学透java自增(++)自减(--)运算符
基本介绍 自增(++)和自减(--)运算符是对变量在原始值的基础上进行加1或减1的操作. 它们都有前缀和后缀两种形式. 前缀就是++在前面,后缀就是++在后面 前缀先自增(减),后缀后自增(减) 前缀 ...
- Luogu P5515 [MtOI2019]灵梦的计算器
简化题意 给定三个实数 \(n, a, b\),求方程 \(\left \lfloor {x ^ a + x ^ b} \right \rfloor = \left \lfloor {n ^ a + ...
- Linux 多路复用(多路转接)
出现原因 如果需要从一个文件描述符中读取数据,然后将数据写入到另一个文件描述符时,可以按照如下的阻塞 IO : while ((n = read(STDIN_FILENO, buf, BUFFER_S ...
- 前端系列:基于 Flex 弹性布局详解
目录 基本介绍 基本概念 父项常见属性 flex-direction justify-content flex-wrap align-items align-content flex-flow 子项常 ...
- 2023-08-18:用go写算法。你会得到一个字符串 text, 你应该把它分成 k 个子字符串 (subtext1, subtext2,…, subtextk)。 要求满足: subtexti 是
2023-08-18:用go写算法.你会得到一个字符串 text, 你应该把它分成 k 个子字符串 (subtext1, subtext2,-, subtextk). 要求满足: subtexti 是 ...