是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数

Instantiate const array reference as constructor parameter using initializer list, allowed or not?

本文关键字:数组 const 引用 实例化 参数 构造函数 列表 许使用 是否      更新时间:2023-10-16

我有一个构造函数,它将对数组的引用作为参数。我可以使用一个包含大括号的初始值设定项列表来调用该构造函数吗
临时数组的生存期是构造函数的生存期,还是不能保证?

我的主要问题:
下面的示例程序正确吗

class Test {
public:
template <size_t N>
Test(const int (&numbers)[N]) {
for (const int &number : numbers)
sum += number;
}
int getSum() const {
return sum;
}
private:
int sum = 0;
};
int main() {
Test test({1, 2, 3});
assert(test.getSum() == 6);
}

然而,上面的代码运行良好,我之所以这么问,是因为我在一个更大的项目中使用了相同的方法,其中数组的元素没有正确初始化。

例如,如果{16}用作构造函数的参数,则有时numbers[0]的值是0b00000000 00000000 00000000 00010000,这是正确的,有时它是不同的数字,例如0b11111111 11111111 11111111 000100000b00000000 00000000 00000011 00010000
在我工作的微控制器平台上,int的大小是4个字节,当numbers[0]错误时,我总是看到相同的模式:最低有效字节是正确的,但在3个最高有效字节中,总是有一个全1的块。这让我相信它没有正确初始化。

我无法孤立这个问题,也无法用一个小例子来重现它。

Test test({1, 2, 3});中,临时数组的生存期在;结束(因此在构造函数调用完成之后(。

所以你在构造函数中的用法是正确的。

但是,如果将对该数组的引用保留为成员,则该引用将变为悬空引用。