一个小时前,我在这里发布了一个答案(链接),我认为我的回答是正确的。然而,我的回答被Martin B给踩了。他说:
根据Michael Burr在[C++03]中的帖子:
new B() - value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
标准规定:
To value-initialize an object of type T means: — 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 T has no accessible default constructor); ..... otherwise, the object is zero-initialized
从第一点可以看出,如果没有用户声明的默认构造函数,则会调用由编译器合成的默认构造函数,该函数将零初始化所有字段(根据最后一点)。
那么我错在哪里呢?我的值初始化解释正确吗?
你只是幸运地得到了零值,因为分配给i的内存恰好被初始化为零。这不能由标准保证。
然而,在阅读Michael Burr的回答(链接)并尝试以下示例代码后:
1)
#include <cassert>
struct B { ~B(); int m; };
int main()
{
B * b = new B();
assert(b->m == 0);
}
我在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);
}
(1)
和(2)
在gcc/Clang上都没有出现任何错误,这让我想到MSVC++2010是否不支持C++03。我不确定。根据Michael Burr在[C++03]中的帖子:
new B() - value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
标准规定:
To value-initialize an object of type T means: — 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 T has no accessible default constructor); ..... otherwise, the object is zero-initialized
从第一点可以看出,如果没有用户声明的默认构造函数,则会调用由编译器合成的默认构造函数,该函数将零初始化所有字段(根据最后一点)。
那么我错在哪里呢?我的值初始化解释正确吗?
:)
- Prasoon Saurav