C++ 标准是否保证使用 {}/() 进行初始化会默认给出“0”?

Does C++ standard guarantee that,using {}/() for initialization will give "0" by default?

问题 1:

struct S
{
   size_t size;
   int j;
   int k;
   int l;
};

S s={sizeof(S)};

C++标准是不是说,上面的{}会将"j,k,l"初始化为0? 似乎可以,它是 cpp 标准的一部分吗?

问题2:

int main()
{
    int* pi=new int[5];
    for(int i=0;i<5;++i)
        cout<<pi[i]<<',';
    return 0;
}

此处指向数组 (pi) 的指针中的元素未初始化,我的 运行 结果可能类似于

6785200,6782912,0,0,0,

但是如果我把它改成

int main()
{
    int* pi=new int[5]();//use ()
    for(int i=0;i<5;++i)
        cout<<pi[i]<<',';
    return 0;
}

那么,所有的pi元素都是“0”。似乎“()”会给元素一个“0”值。这部分是cpp标准吗?

我也试过像这样使用“()”给出另一个值:

int* pi=new int[5](7);

但是编译失败。如何将初始化值赋给指向所有元素都具有相同值的数组的指针?

Question 1

是的,由 aggregate initialization 保证 特别是:

If the number of initializer clauses is less than the number of members [and bases (since C++17)] or initializer list is completely empty, the remaining members [and bases (since C++17)] are initialized [by their default initializers, if provided in the class definition, and otherwise (since C++14)] by empty lists, which performs value-initialization. If a member of a reference type is one of these remaining members, the program is ill-formed (references cannot be value-initialized).

.

Question 2

使用std::vector:

std::vector<int> pi(5, 7);

问题1已有完美答案,我来回答问题2。

是的,你的观察是正确的。在 new 之后添加 () 将元素的 默认初始化 变为 值初始化 。第一种形式对创建的对象不做任何事情(所以你观察到随机数),但值初始化将初始化成员 - 在这种情况下,会将元素设置为 0。不幸的是,没有办法为动态 int 数组执行特定的初始化- 您可以让它们保持未初始化状态,也可以对它们进行值初始化(到 0)。

使用 std::vector 解决了这个问题。