VS2013列表初始化

时间:2014-06-10 01:49:16

标签: c++ c++11 value-initialization

考虑代码

#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

为指导
List-initialization of an object or reference of type T is defined as follows:
— If the initializer list has no elements and T is a class type with a default constructor, the object is value-initialized.

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

如果我错过了什么,请告诉我。

2 个答案:

答案 0 :(得分:1)

你想说的是:

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

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

答案 1 :(得分: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编译器在Debug版本中填充内存的调试模式。这似乎是一个已知的错误,VS2012和VS2013都是reported here

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

B() : member{} {}