值初始化和非POD类型 [英] Value initialization and Non POD types
问题描述
一小时前我发布了一个答案这里根据我是正确的。但是我的回答被 Martin B 拒绝。他说
你只是幸运,并且得到零,因为我被置于的内存碰巧是零初始化。
但是在阅读Michael Burr的回答后,此处并尝试下面的示例代码
1)
#include< cassert>
struct B {〜B(); int m; };
int main()
{
B * b = new B();
assert(b-> m == 0);
}
我在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);
}
(1)
也不是(2)
在gcc / Clang给了任何这样的错误,让我想如果MSVC ++ 2010不支持C ++ 03。我不确定。
根据Michael Burr的文章[在C ++ 03]
new B() - value-initializes B其中零初始化所有字段,因为它的默认ctor是编译器生成,而不是用户定义。
< blockquote>
标准说
要初始化一个类型为Tmeans的对象: p>
- 如果T是带有用户声明的构造函数(12.1)的类类型(第9节),则T的默认构造函数如果Thas没有可访问的默认构造函数,初始化是错误的);
.....
否则,对象是零初始化
如果没有用户声明的默认构造函数编译器合成的默认构造函数将被调用,它将
零初始化
所有字段(根据最后一点)。
那么我错了什么?
解决方案Visual Studio在所有当前版本(2005,2008,2010)中都有已知的错误它没有正确地实现没有用户声明的构造函数的非POD类型的值初始化。
根据语言规则,做展示编译器问题。这些是一些错误报告,注意它们都关闭或解决为不会修复。
http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization
An hour ago I posted an answer here which according to me was correct. However my answer was downvoted by Martin B. He said
You're just lucky and are getting zeros because the memory that i was placed in happened to be zero-initialized. This is not guaranteed by the standard.
However after reading Michael Burr's answer here and trying the following sample code
1)
#include <cassert> struct B { ~B(); int m; }; int main() { B * b= new B(); assert ( b->m ==0); }
I got a debug error on MSVC++2010.
I got a similar error when I tried the following code [My answer here] on 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); }
Neither
(1)
nor(2)
gave any such error on gcc/Clang which made me think if MSVC++2010 does not support C++03. I am not sure.According to Michael Burr's post [in C++03]
new B() - value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
The Standard says
To value-initialize an object of type Tmeans:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if Thas no accessible default constructor);
.....
otherwise, the object is zero-initialized
From the first point if there is no user declared default constructor the compiler synthesized default constructor will be called which will
zero initialize
all the fields (according to last point).So where am I wrong? Is my interpretation of value initialization correct?
解决方案Visual Studio has known bugs in all current versions (2005, 2008, 2010) where it doesn't correctly implement value-initialization for non-POD types that don't have a user declared constructor.
By the language rules none of you asserts should fire but do exhibit the compiler issues. These are some of the bug reports, note that they are all closed or resolved as "Won't Fix".
http://connect.microsoft.com/VisualStudio/feedback/details/564268/c-value-initialization
这篇关于值初始化和非POD类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!