C++中数组的大括号初始化器的奇怪使用问题

fnatzsnv  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(106)

我目前正在一家已经存在了一段时间的公司浏览和梳理大量的旧代码。
我们最近遇到了未初始化的C成员具有垃圾数据的问题,这是进行内务处理的原因之一。
不幸的是,随着这些年来C
的所有更新,有一些警告超出了我的理解范围。
我知道如果你在头文件中声明并初始化一个数组,比如:
float m_thisArray[16]{}; // direct initialization或:
float m_thatArray[16] = {}; // copy initialization
所有值都应自动设置为0.0f
然而,本周我还看到:float m_floatArray[16];,然后是:*m_floatArray = {};的值。
第二个是保证所有元素为零吗?它不会是我的首选,但此时我真正知道的是它不会抛出编译错误。

wwtsj6pe

wwtsj6pe1#

第二个能保证所有元素归零吗?
不,它将数组的第一个且仅第一个元素设置为零。
m_floatArray是一个数组左值,内置的*需要一个右值作为操作数。因此,数组到指针的转换被应用到m_floatArray,产生一个指向m_floatArray的第一个元素的指针。*m_floatArray然后解引用该指针,得到一个float左值,它引用数组的第一个元素。然后,在*m_floatArray = {}中将该元素赋值给。对浮点左值的赋值意味着设置为零,但它仅适用于*m_floatArray所指的单个元素。
我真的不知道原作者是怎么想到写这行代码的,如果只有m_floatArray = {},编译器会抱怨数组是不可赋值的,但是我不知道人们是怎么想到要添加*的。
要在构造函数中将数组中的所有元素设置为零,请使用构造函数的成员初始化器列表,在该列表中可以写入m_floatArray{}m_floatArray()以将所有元素初始化为零。作为构造函数的替代,您还可以使用在类定义本身中提到的默认成员初始化器之一。
如果在初始化时无法执行此操作,则使用std::fill
这也是std::array优于内置数组的另一个不寻常的例子,这种不直观的数组到指针的衰减在std::array中不会发生。

相关问题