gpt4 book ai didi

c++ - 在 C++11 中,您能否始终(安全地)用空初始化器替换 memset() 初始化?

转载 作者:可可西里 更新时间:2023-11-01 15:53:32 27 4
gpt4 key购买 nike

我经常在代码中遇到使用 memset 手动零初始化的 POD 结构,如下所示:

struct foo;
memset(&foo, 0, sizeof(foo));

我检查了 C++11 标准,它说:“初始化器是一组空括号的对象,即 (),应该被值初始化。” 已关注通过: “对 T 类型的 [pod struct] 进行值初始化意味着......该对象是零初始化的。”

那么...这是否意味着您可以始终安全地将上述代码压缩为以下代码:

struct foo{};

并且有一个保证初始化的结构,就像你调用了 memset(&foo, 0, ...) 一样?


如果是这样,那么一般来说,您能否像这样使用空初始化器安全地初始化任何东西:

SomeUnknownType foo{};  // will 'foo' be completely "set" to known values?

我知道这在 C++03 中并不总是可行(在 uniform initialization syntax 之前),但现在在 C++11 中对于任何类型都可行吗?

最佳答案

您当然可以使用空括号初始化任何标准布局类型并将其初始化为零。不幸的是,一旦您将构造函数添加到图片中,这就不一定是真的了:

struct foo {
int f;
};
struct bar {
int b;
bar() {}
};

foo f{};
bar b{};

虽然 f.f 是零初始化的,但是 b.b 是未初始化的。但是,对于 bar 您无能为力,因为您也不能 memset() 它。它需要修复。

关于c++ - 在 C++11 中,您能否始终(安全地)用空初始化器替换 memset() 初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284527/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com