1

考虑代码

#include "stdafx.h"
#include <Windows.h>
#include <iostream>

struct B
{
public:
    void f() { for (auto &v : member) { std::cout << v << std::endl; } }
private:
    int member[100];
};

int main()
{
    B b{};
    b.f();
}

我认为此代码由 $8.5.4/3 指导

类型 T 的对象或引用的列表初始化定义如下:
— 如果初始值设定项列表没有元素并且 T 是具有默认构造函数的类类型,则对象是值初始化的。

相反,VS2013 编译器发出所有 0xCCCCCCCC 暗示它将 b.member 的所有元素保留为未初始化。因此,它似乎正在执行默认初始化而不是值初始化。

如果我遗漏了什么,请告诉我。

4

2 回答 2

1

你想说的是:

int main()
{
    B b = {};  // = {} expresses that you want to zero-init the member vars
    b.f();
}

如果 B 具有(非默认)构造函数或任何具有构造函数的成员,则上述 using 代码示例={}可能会生成编译器错误。

于 2014-06-10T03:54:52.153 回答
0

您的代码示例可以进一步简化。

#include <iostream>

struct B
{
public:
    void f() { std::cout << member << std::endl; }
private:
    int member;
};

int main()
{
    B b{};
    b.f();
}

这将产生输出:

-858993460

它是0xCCCCCCCC十六进制的,VC 编译器在调试版本中填充内存的调试模式。这似乎是此处报告的 VS2012 和 VS2013 的已知错误。

您可以通过定义一个值单独初始化数据成员的构造函数来解决该错误。member在您的情况下,添加此构造函数将导致所有元素0

B() : member{} {}
于 2014-06-10T03:30:00.653 回答