【问题标题】:Question about brace-initialization of data member array in constructor?关于构造函数中数据成员数组的大括号初始化的问题?
【发布时间】:2022-09-21 16:52:20
【问题描述】:

在以下课程中:

struct S {
    S() : B{} {}

    const uint8_t B[32];
};

B 数组的所有 32 个字节是否保证被默认构造函数初始化为零?

有没有办法创建S 类型的对象,使得B 数组的任何元素都不为零? (没有 const 转换或重新解释内存)。 S 的所有形式的初始化都会导致 B 数组归零吗?

  • 你能举例说明你想如何初始化S::B,而不是将它归零?
  • @paolo 我认为希望避免未初始化的字节,而不是将字节初始化为特定的非零值。
  • @paolo:C++ 中有几种不同类型的初始化,它们中的任何一种都可以产生一个具有非零 B 数组元素的 S 对象吗?
  • 顺便说一句,在数组被零填充后,你打算用它们做什么?以后更改它们的任何尝试都是未定义的行为。没有任何形式的 const_casting 可以绕过它。
  • @j6t:这是理解语言机制的玩具示例。

标签: c++ c++17


【解决方案1】:

B 数组的所有 32 个字节是否保证被默认构造函数初始化为零?

是的,B 是值初始化的,这对于数组意味着每个成员都是值初始化的 - 原始类型的值初始化为 0。

有没有办法创建一个 S 类型的对象,使得 B 数组的任何元素都不为零?

据我所知,虽然S 仍然有默认的复制构造函数,所以如果你得到一个S 和非零B,你可以克隆这些对象。

  • const 成员保证在整个生命周期内不能更改值,因此必须在初始化时设置任何非零值,这会导致第三个问题......

是否所有形式的 S 初始化都会导致 B 数组归零?

是的,S 不是聚合(由于用户提供的 ctor),因此无法直接初始化成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2021-03-26
    • 2011-05-06
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多