在c ++ 11中,您是否可以(安全地)用空的初始化程序替换memset()初始化?

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().它需要修复.