C++11中std::array定义时不同大括号及赋值写法的区别
C++11中std::array不同大括号初始化写法的差异说明
std::array是C11引入的固定大小容器,属于聚合类型,底层仅封装了一个原生数组成员,没有自定义构造函数,所有初始化逻辑都遵循C聚合初始化规则。
首先你给出的第三种写法存在笔误,正确的拷贝列表初始化写法为 std::array<int, 2> a = {1, 2},以下针对三种合法写法逐一说明差异:
- 写法1:
std::array<int, 2> a{1, 2}
这是直接列表初始化写法,利用了C聚合初始化的大括号省略规则:当初始化列表的元素刚好可以填满聚合内部唯一的数组成员时,可以省略内层对应原生数组的大括号。该写法完全符合C11标准要求,所有主流编译器的C11模式均支持,仅部分极早期的C11预览版编译器可能存在兼容问题。 - 写法2:
std::array<int, 2> b{{1, 2}}
这是完整的聚合初始化写法,外层大括号用于初始化std::array对象本身,内层大括号用于初始化其内部封装的原生数组成员,是兼容性最好的写法,所有支持C++11的编译器均可正常编译。 - 写法3:
std::array<int, 2> a = {1, 2}
这是拷贝列表初始化写法,对于std::array这类无explicit构造函数的聚合类型,该写法和写法1的效果完全一致,不会产生额外的拷贝或移动开销,最终生成的二进制代码与写法1、写法2没有任何差异。
以上三种写法在符合C11标准的现代编译器下,运行效果、性能表现完全一致,仅存在语法兼容性的细微差异。如果你的代码需要兼容非常旧的C11编译器,优先选择双大括号的完整写法即可。
内容的提问来源于stack exchange,提问作者rherrmannr
相关产品推荐
相关产品推荐

