`计算机知识` `C++` initializer_list初始化列表, 括号列表初始化, 括号集合

本文主要区分了C++中的初始化列表、括号集合和括号列表的概念,强调它们之间的不同。初始化列表并不存储数据,而是引用外部数据,避免深拷贝。而括号集合用于数组和容器的初始化,它会创建临时对象。文章探讨了它们的用途,如容器初始化和特殊函数参数,并指出使用中可能存在的隐患,特别是在对象生命周期管理方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念区分

首先, 要区分几个概念, 也就是会产生的歧义:
1, initializer_list 初始化列表
2, {1, 2, 3} 括号集合 (自己起的名, 不重要, 重要的是记住它的形式)
3, ST() : a( 0), b( 1){} 构造函数的初始化列表 (这个就和本文章无关了, 但名字确实是一样的)
这3个概念, 其实是完全不同的


补充…
其实, {1, 2}括号集合, 官方名字是: initializer list初始化列表… 这也不矛盾, 因为initializer_list中 有个_嘛, 而且它是类;
一个是(列表), 一个是(类)


括号集合
{1, 2, 3}叫做: 括号集合 (我自己起的名…), 它在C++11之前 就有, 我们很早就知道, int A[] = {1, 2, 3};这种数组初始化的方式
这在C语言里都可以的! (但是, C语言不支持: int A[] = {a, b, c}, 因为里面有变量), 它在C语言里的名称是 (常量初始化列表) 我起的
即: (1, 里面的东西, 必须都是常量) (2, 它必须用于初始化 单独的{1, 2}A = {1, 2}这都是错误的, 只能是在数组定义时的初始化)
而到了C++, 它的功能丰富了, 在C++{a, b}是可以的;
… 它真的非常特殊, 一般只是用于 (临时变量)的用途, 比如: 初始化注意初始化和赋值的区别, 强转, 都是临时性的使用一下)
… 以至于, 你decltype( {1, 2})这是报错的!! 没有这个类型!

初始化列表
这是在C++11后 出来的, 不要以为{1, 2}它是初始化列表, 这是错误的 (它确实和初始化列表有关系)
一切看源码:

template<class _E>
class initializer_list
{
   
private:
	const _E *          _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) {
    }

	//* 明明还有 `constexpr initializer_list( `const . &` 和 `. &&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值