一小时前我发了一个答案here,根据我的说法是正确的。但是我的答案被Martin B所取消。他说
你很幸运,并且因为我所处的内存恰好是零初始化而得到了零。标准不保证这一点。
然而,在阅读了Michael Burr的回答here并尝试以下示例代码
之后1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
我在MSVC ++ 2010上遇到调试错误。
当我在MSVC ++ 2010上尝试以下代码[我的回答here]时,我遇到了类似的错误
2)
#include <cassert>
struct Struct {
std::string String;
int Int;
bool k;
// add add add
};
struct InStruct : Struct
{
InStruct() : Struct() {}
};
int main()
{
InStruct i;
assert(i.k == 0);
}
(1)
和(2)
都没有给gcc / Clang带来任何错误,这让我想到MSVC ++ 2010不支持C ++ 03。我不确定。
根据Michael Burr的帖子[在C ++ 03中]
new B() - value-initializes B 零初始化所有字段,因为它的默认ctor是编译器生成的而不是用户定义。
标准说
对Tmeans类型的对象进行值初始化:
- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则T的默认构造函数被称为(如果Thas no,则初始化是错误的access default constructor);
.....
否则,该对象为零初始化
从第一点开始,如果没有用户声明的默认构造函数,将调用编译器合成的默认构造函数,zero initialize
所有字段(根据最后一点)。
那我在哪里错了?我对值初始化的解释是否正确?
答案 0 :(得分:33)
Visual Studio已知所有当前版本(2005,2008,2010)中的错误,它们没有正确实现没有用户声明的构造函数的非POD类型的值初始化。
根据语言规则,你们中没有一个断言应该触发,但确实会出现编译器问题。这些是一些错误报告,请注意它们都已关闭或解析为“无法修复”。
http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization
答案 1 :(得分:6)
对于那些在2015年遇到这个问题的人,像我一样:
所有上述问题都已在VS 2015中修复。值初始化现在可以按照标准中的定义进行。