值初始化和非POD类型

Pra*_*rav 17 c++ initialization visual-c++ value-initialization

一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被Martin B贬低了.他说

你很幸运,并且因为我所处的内存恰好是零初始化而得到了零.标准不保证这一点.

然而读迈克尔·伯尔的回答后,这里并尝试下面的示例代码

1)

#include <cassert>

struct B { ~B(); int m; };

int main()
{
   B * b = new B();
   assert(b->m == 0);
}
Run Code Online (Sandbox Code Playgroud)

我在MSVC++ 2010上遇到调试错误.

我有一个类似的错误,当我尝试下面的代码[我的答案在这里 ]在MSVC++ 2010

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);
}
Run Code Online (Sandbox Code Playgroud)

既没有(1)也没有(2)给gcc/Clang这样的错误让我想到MSVC++ 2010不支持C++ 03.我不确定.

根据Michael Burr的帖子[在C++ 03中]

new B() - 初始化B,它对所有字段进行零初始化,因为它的默认ctor是编译器生成的而不是用户定义的.

标准说

要对Tmeans类型的对象进行值初始化:

- 如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果Thas没有可访问的默认构造函数,则初始化是错误的);

.....

否则,该对象被零初始化

从第一点开始,如果没有用户声明的默认构造函数,则将调用编译器合成的默认构造函数,这将是zero initialize所有字段(根据最后一点).

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

CB *_*ley 34

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

  • @sharptooth:"所有理智的Visual C++开发人员",我不知道如何在使用Visual C++时保持理智.我发现保持理智的唯一方法是停止使用它:x (7认同)
  • @Naveenn:现有代码库.我认为每次他们没有正确实现事情时,他们至少应该发出警告(比如他们使用`typename`关键字的松弛) (2认同)

Cod*_*key 7

对于在2015年偶然发现这个问题的人,像我一样:

所有上述问题都已在VS 2015中修复.值初始化现在按照标准中的定义工作.