不管是为了统一性,还是避免发生窄化转换,尽可能使用初始化列表。
- 说明
 - 哪些对象可以使用列表初始化?
 - 代码演示
 
说明
C++11 引入了列表初始化(也称为统一初始化或初始化列表),它是一种使用花括号 {} 来初始化对象的语法,例如 int a{5}; 。
列表初始化的优点包括初始化对象时不允许发生窄化转换(例如将 double 隐式转换为 int 时丢失精度)
能够初始化任何对象,只要它支持适当的构造函数或有合适的初始化器列表重载。
哪些对象可以使用列表初始化?
几乎所有类型的对象都可以使用列表初始化,包括:
- 基本数据类型(如 
int、double等) - 类对象(如果有适当的构造函数)
 - 数组
 - STL 容器(如 
std::vector,std::map等) - 初始值列 
std::_list:轻量级的容器类型,专门设计来接收花括号初始化列表中的元素,可以接收一个任意长度的同类型元素列表。(C++11) 
代码演示
#include <iostream>
#include <vector>
#include <initializer_list>
// 一个简单的类,展示带有构造函数的列表初始化
class MyClass {
public:
    MyClass(std::initializer_list<int> lst) {
        for (auto elem : lst) {
            std::cout << elem << ' ';
        }
        std::cout << '\n';
    }
};
void print(std::initializer_list<int> vals) {
    for (auto p = vals.begin(); p != vals.end(); ++p) {
        std::cout << *p << "\n";
    }
}
int main() {
    // 基本数据类型的列表初始化
    int a{ 5 };
    double b{ 3.14 };
    char c{ 'A' };
    // 不允许窄化转换
    // int d{3.14}; // 错误:窄化转换
    // 类对象的列表初始化
    MyClass obj{ 1, 2, 3, 4, 5 };
    // 数组列表初始化
    int arr[]{ 1, 2, 3, 4, 5 };
    // STL 容器的列表初始化
    std::vector<int> vec{ 1, 2, 3, 4, 5 };
    //初始值列
    print({ 1, 2, 3, 4, 5 }); // 使用花括号初始化列表
    // 打印演示
    std::cout << "a: " << a << '\n'
        << "b: " << b << '\n'
        << "c: " << c << '\n';
    std::cout << "arr: ";
    for (auto elem : arr) {
        std::cout << elem << ' ';
    }
    std::cout << '\n';
    std::cout << "vec: ";
    for (auto elem : vec) {
        std::cout << elem << ' ';
    }
    std::cout << '\n';
    return 0;
}
 
运行结果:




















