2014-06-10 55 views
1

考虑代码VS2013列表初始化

#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.成员未初始化。所以,它似乎正在执行默认初始化而不是数值初始化。

请让我知道如果我失去了一些东西。

+0

是不是当你有一个DEBUG编译? –

回答

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 reported here已知的bug。

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

B() : member{} {} 
+0

但是,如果'会员'被公开,这个缺陷是不可重现的。所以,它似乎在非聚集类 – user3701522

+0

@ user3701522的情况下是的,我也可以重现这一点。但请注意,上述行为仍然是一个错误。基于成员的可访问性,值初始化没有区别。 – Praetorian

1

你想说这是什么:

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

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