Mik*_*sar 10 c++ uniform-initialization c++11
我经常在代码中遇到POD结构,这些结构是手动零初始化的,memset
如下所示:
struct foo;
memset(&foo, 0, sizeof(foo));
Run Code Online (Sandbox Code Playgroud)
我检查了C++ 11标准,它说:"一个对象,其初始化器是一组空的括号,即(),应该进行值初始化." 接下来是: "对T类型的[pod结构]进行值初始化意味着...对象被零初始化."
所以......这是否意味着您可以随时安全地将上述代码压缩为以下代码:
struct foo{};
Run Code Online (Sandbox Code Playgroud)
并且有一个保证初始化的结构,就好像你已经调用了一样memset(&foo, 0, ...)
?
如果是这样,那么一般来说,你可以使用空的初始化器安全地初始化任何东西,如下所示:
SomeUnknownType foo{}; // will 'foo' be completely "set" to known values?
Run Code Online (Sandbox Code Playgroud)
我知道在C++ 03中(在统一初始化语法之前)并不总是可行的,但现在C++ 11中是否可以用于任何类型?
Die*_*ühl 10
您当然可以使用空括号初始化任何标准布局类型,并将其初始化为零.一旦你将构造函数添加到图片中,不幸的是,这不一定是真的:
struct foo {
int f;
};
struct bar {
int b;
bar() {}
};
foo f{};
bar b{};
Run Code Online (Sandbox Code Playgroud)
虽然f.f
初始化为零,b.b
但未初始化.但是,你无能为力,bar
因为你也做不到memset()
.它需要修复.