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/

相关文章:

linux - 无法将 ‘const timeval’ 转换为 ‘__time_t {aka long int}’

c++ - 如何更新到 mingw-gcc 4.8.2?

c++ - 创建一个子类 vector ?

c++ - 在 Windows 上将时间字符串转换为纪元时间

c++11 - 连续存储容器和 move 语义

c++ - std::shared_ptr - 我可以使用等号 (=) 进行初始化吗?

c++ - 当文件名包含宽字符时使用 ifstream

c++ - 为什么在使用STL列表时不能使用此回文功能?

c - 目前有哪些方法可以让您在 C 中调用 Go 函数?

php - 使用 cURL 编译 PHP 失败