令人困惑的声明和初始值设定项

Confusing declaration and initializer

这个声明很混乱:

char* q {new char[1024]{}}; // q[i] becomes 0 for all

这是“指向 char 数组的指针”,还是“char 指针的数组”?

我认为 new char[1024]{} 正在初始化一个包含 1024 个元素的 char 数组,每个元素的值为 0

所以这与:

char* q = [0,0,....] // until 1024

正确吗?

char* q {new char[1024]{}};

等于

char* q = new char[1024]{};

这又等于

char* q = new char[1024] { 0, 0, 0, 0 /* 1020 more zeros */ }

q 是指向 char 的指针。也就是说,它的类型是char *.

它使用表达式 new char[1024]{} 进行初始化,该表达式动态分配 char 的数组并将它们零初始化。如果失败,将抛出异常。

q 将指向动态分配数组中的第一个 char。它不是数组。

不一样

char* q = [0,0,....] // until 1024

因为这是无效语法。它也不等同于

char* q = {0,0,....}; //  1024 zeros in initialiser

因为q是一个指针,不能初始化为一组值。它的(净)效果更接近

char *q = new char[1024];     //  dynamically allocates chars uninitialised here
std::fill(q, q + 1024, '[=11=]');

除了字符初始化为零,而不是先取消初始化然后用零覆盖(当然,这取决于编译器如何初始化字符)。