C++ 11是否保证"int a [8] = {};" 在语义上等同于"int a [8] {};"?

xml*_*lmx 14 c++ performance standards initialization c++11

在C++ 11中,以下两个语句都是合法的:

声明1. int a[8] = {};

声明2. int a[8]{};

但是,我更喜欢声明1而不是声明2因为我认为声明1更具表现力.

C++ 11标准是否保证两个语句在语义上是等效的?

Luc*_*ore 19

从语义上讲,它们不一样,就像复制/直接初始化一样:

8.5.4列表初始化[dcl.init.list]

1列表初始化是从braced-init-list初始化对象或引用.这样的初始化程序称为初始化程序列表,列表的逗号分隔的初始化程序子句称为初始化程序列表的元素.初始化列表可以为空.列表初始化可以在直接初始化或copyinitialization上下文中进行; 直接初始化上下文中的列表初始化称为直接列表初始化,复制初始化上下文中的列表初始化称为复制列表初始化.[...](强调我的)

原始答案,处理比较性能:不,该标准规定了对算法的一些复杂性限制,但在这些问题上没有表现.这最好留给编译器,但所有编译器都可能生成相同的代码.

考虑复制初始化与直接初始化.标准只规定它们是什么,它从不说一个必须比另一个快,或者它们必须表现相同.这完全取决于编译器.

这是一件好事,因为编译器知道什么是最适合该平台的.如果标准确实施加了这样的限制,那么它可以说+比必须更快*,这非常直观.但想想一个为乘法而构建的平台,它实际上*在机器代码中的计算速度更快.编译器必须不遗余力地转换*为较慢的指令,只是为了符合标准.