Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

(不要与 成员初始化器列表 混淆)

定义于头文件 <initializer_list>
template < class T >
class initializer_list ;
(C++11 起)

一个类型为 std::initializer_list<T> 的对象是一个轻量级代理对象,它提供对类型为 const T 的对象数组(可能分配在只读内存中)的访问。

当出现以下情况时,会自动构造一个 std::initializer_list 对象:

std::initializer_list 可能实现为一对指针或指针加长度的组合。复制 std::initializer_list 不会复制对应初始化列表的 后备数组

如果声明了 std::initializer_list 的显式或部分特化,则程序非良构。

目录

成员类型

名称 定义
value_type T
reference const T &
const_reference const T &
size_type std::size_t
iterator const T *
const_iterator const T *

成员函数

创建空的初始化列表
(公开成员函数)
Capacity
返回初始化列表中的元素数量
(公开成员函数)
Iterators
返回指向首元素的指针
(公开成员函数)
返回指向末元素后一位置的指针
(公开成员函数)

非成员函数

重载 std::begin
(函数模板)
特化 std::end
(函数模板)
std::initializer_list 重载的自由函数模板
返回容器或数组的逆向起始迭代器
(函数模板)
(C++14)
返回容器或数组的逆向末尾迭代器
(函数模板)
(C++17)
检查容器是否为空
(函数模板)
(C++17)
获取底层数组的指针
(函数模板)

注释

功能测试宏 标准 功能
__cpp_initializer_lists 200806L (C++11) 列表初始化 std::initializer_list

示例

#include <cassert>
#include <initializer_list>
#include <iostream>
#include <vector>
template<class T>
struct S
{
    std::vector<T> v;
    S(std::initializer_list<T> l) : v(l)
    {
         std::cout << "constructed with a " << l.size() << "-element list\n";
    }
    void append(std::initializer_list<T> l)
    {
        v.insert(v.end(), l.begin(), l.end());
    }
    std::pair<const T*, std::size_t> c_arr() const
    {
        return {&v[0], v.size()}; // return语句中的复制列表初始化
                                  // 这不是std::initializer_list的使用
    }
};
template<typename T>
void templated_fn(T) {}
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // 复制列表初始化
    s.append({6, 7, 8});        // 函数调用中的列表初始化
    std::cout << "The vector now has " << s.c_arr().second << " ints:\n";    
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::cout << "Range-for over brace-init-list: \n";
    for (int x : {-1, -2, -3}) // auto规则使得此范围for循环正常工作
        std::cout << x << ' ';
    std::cout << '\n';
    auto al = {10, 11, 12}; // auto的特殊规则
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
    auto la = al; // 顶层代理对象的浅拷贝
    assert(la.begin() == al.begin()); // 保证:后备数组相同
    std::initializer_list<int> il{-3, -2, -1};
    assert(il.begin()[2] == -1); // 注意对缺失的operator[]的替代
    il = al; // 浅拷贝
    assert(il.begin() == al.begin()); // 保证
//  templated_fn({1, 2, 3}); // 编译器错误!"{1, 2, 3}"不是表达式,
                             // 它没有类型,因此无法推导T
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // 正确
    templated_fn<std::vector<int>>({1, 2, 3});           // 同样正确
}

输出:

constructed with a 5-element list
The vector now has 8 ints:
1 2 3 4 5 6 7 8
Range-for over brace-init-list:
-1 -2 -3
The list bound to auto has size() = 3

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时行为 正确行为
LWG 2129 C++11 std::initializer_list 可能存在显式
特化或部分特化
此情况下程序
属于非良构

参见

(C++20)
对连续对象序列的非拥有视图
(类模板)
只读字符串视图
(类模板)