C++代码int i {};属于List Initialization还是Value Initialization?
结论
int i {}; 属于列表初始化(List Initialization),值初始化是本次列表初始化触发的具体初始化行为。
术语解释
你提到的cppreference表述翻译为:
可空的、由花括号包裹的表达式列表,或者嵌套的花括号初始化列表
这句话的核心是定义列表初始化的核心语法特征:只要初始化时使用了花括号包裹的参数结构,不管花括号内有没有内容、有没有嵌套其他花括号,都首先归为列表初始化的语法范畴。
两种初始化的核心区别
两者是完全不同维度的分类:
- 列表初始化是从语法形式角度的分类:所有用
{}包裹初始化参数的写法都属于列表初始化,和括号内有没有内容无关
比如int a{1};、std::vector<int> arr{1,2,3};、int b{};都属于列表初始化 - 值初始化是从初始化实际执行逻辑角度的分类:当列表初始化的花括号为空、且目标类型没有自定义的默认构造函数(比如int这种基础算术类型)时,就会触发值初始化,将对象清零,这里的
i最终会被初始化为0
补充说明
如果你用的是int i();写法,会被编译器识别为无参数、返回int的函数声明,而非变量初始化,这也是C++引入空花括号列表初始化的原因之一,用来避免这种歧义。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

