今天早上我问自己一些事情,我找不到正确"谷歌"的话:
让我们说:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
Run Code Online (Sandbox Code Playgroud)
现在,如果我默认实例化Foo,Foo2并且Foo3:
Foo foo;
Foo2 foo2;
Foo3 foo3;
Run Code Online (Sandbox Code Playgroud)
在哪种情况下,bar会员是否正确初始化?
(Foo3显然很明显地初始化它,并且只在这里显示明确差异Foo2所以问题主要是关于前两个.)
谢谢 !:)
一个小时前我在这里发了一个答案,根据我的说法是正确的.然而我的回答却被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++ …
有没有办法强制0\false\nullptr在Visual C++发布模式下初始化pod类型?
更具体地说,我不想更改我的代码,只需将其编译为初始化为的pod类型 0\false\nullptr.
我想要这个,因为我希望我们的系统是确定性的.
我有一个只有双成员变量的结构,例如
struct foo { double a, b, c; };
Run Code Online (Sandbox Code Playgroud)
另一个类有一个std::vector<foo> v成员,它std::vector<foo>::vector(size_t)在初始化列表中调用构造函数.
我想做的是编写一个默认构造函数,foo以便将其中的所有双精度初始化为零,而不必编写
foo(): a(0), b(0), c(0) { }
Run Code Online (Sandbox Code Playgroud)
我一直需要添加更多变量foo,但将它们作为容器的元素是没有意义的std::array<double>,因为它们都有不同的用途.