c++ - C++ 中 {} 和 {0} 的大括号初始化区别

标签 c++ c++11 compilation

几年前,我读到使用 {} 和 {0} 来初始化 POD 在 C++ 中有一些细微的差异,其中可能会在您的代码中引入悲观化。

D3D11_TEXTURE2D_DESC dsd = {};
D3D11_TEXTURE2D_DESC dsd2 = { 0 }:

虽然我知道 {0} 肯定是从 c 继承的东西,而 {} 是 c++11 中引入的东西,但据说两者在编译期间都被翻译为相同的 memset() 调用:
memset(&dsd, 0, sizeof(dsd));

然而,两种大括号初始化风格之一做了一些内存初始化未对齐的事情,有人关心哪种风格更好,为什么?

最佳答案

您引用的语法称为 aggregate initialization .

If the number of initializer clauses is less than the number of members or initializer list is completely empty, the remaining members are value-initialized



由于 POD 的值初始化与零初始化相同,因此您显示的两种语法之间没有区别。

甚至在 C++11 之前就是这种情况——空的初始化列表不是它引入的东西。从 C++11 开始,非 POD 也允许使用该语法。聚合初始化现在是这个新列表初始化的一个特例。

关于c++ - C++ 中 {} 和 {0} 的大括号初始化区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006259/

相关文章:

在 C 中创建一个有效的共享库

java - 为什么Java不能区分对象和数字?

makefile - make clean、make clobber、make distclean、make mrproper 和 make realclean 之间有什么区别?

c++ - rxcpp - 当一个可观察对象发出一个值时,为什么不调用所有观察者的 on_next 函数

c++ - 生成带三角条的平面

c++ - 具有相同散列值的值是否在同一个 std::unordered_map 桶中?

C++队列非锁定

c++ - C++11 中具有对齐元素的 std::array 类型

c++ - Eigen ConditionType数组:一种有效的广播方式,而不是循环

c++ - 如何在 C++ 中的字符串数组中查找单词位置?