一小时前我发布了一个答案here据我所知,这是正确的。然而我的回答被否决了Martin B。他说
你很幸运,得到了零,因为我所在的内存恰好是零初始化的。标准不保证这一点。
然而读完迈克尔·伯尔的回答后here并尝试以下示例代码
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
我在 MSVC++ 2010 上遇到调试错误。
当我尝试以下代码时,我遇到了类似的错误[我的答案here]关于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)
在 gcc/Clang 上出现任何此类错误,这让我思考 MSVC++2010 是否不支持 C++03。我不知道。
根据 Michael Burr 的帖子 [in C++03]
new B() - 对 B 进行值初始化对所有字段进行零初始化,因为其默认构造函数是编译器生成的与用户定义相反。
标准说
对 Tmeans 类型的对象进行值初始化:
— 如果 T 是具有用户声明的构造函数 (12.1) 的类类型(第 9 条),然后调用 T 的默认构造函数(如果没有可访问的默认构造函数,则初始化是错误的);
.....
否则,该对象将被零初始化
从第一点开始,如果没有用户声明的默认构造函数,将调用编译器合成的默认构造函数,这将zero initialize
所有字段(根据最后一点)。
那么我哪里错了呢?我对值初始化的解释正确吗?
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-driven-classes-without-user-declared-constructor
http://connect.microsoft.com/VisualStudio/feedback/details/100744/value-initialization-in-new-expression
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)