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