概念区分
首先, 要区分几个概念, 也就是会产生的歧义:
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 . &` 和 `. &&