值初始化和非POD类型

时间:2010-10-14 08:18:24

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

一小时前我发了一个答案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所有字段(根据最后一点)。

那我在哪里错了?我对值初始化的解释是否正确?

2 个答案:

答案 0 :(得分:33)

Visual Studio已知所有当前版本(2005,2008,2010)中的错误,它们没有正确实现没有用户声明的构造函数的非POD类型的值初始化。

根据语言规则,你们中没有一个断言应该触发,但确实会出现编译器问题。这些是一些错误报告,请注意它们都已关闭或解析为“无法修复”。

http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization

http://connect.microsoft.com/VisualStudio/feedback/details/484295/vc-does-not-value-initialize-members-of-derived-classes-without-user-declared-constructor

http://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression

答案 1 :(得分:6)

对于那些在2015年遇到这个问题的人,像我一样:

所有上述问题都已在VS 2015中修复。值初始化现在可以按照标准中的定义进行。