C++ 使用初始值设定项列表将常量数组引用实例化为构造函数参数,是否允许?
我有一个构造函数,它将数组的引用作为参数。我可以使用括号内的初始值设定项列表调用该构造函数吗?C++ 使用初始值设定项列表将常量数组引用实例化为构造函数参数,是否允许?,c++,arrays,C++,Arrays,我有一个构造函数,它将数组的引用作为参数。我可以使用括号内的初始值设定项列表调用该构造函数吗? 临时数组的生存期是构造函数的生存期,还是不保证 我的主要问题: 以下示例程序正确吗? class Test { public: template <size_t N> Test(const int (&numbers)[N]) { for (const int &number : numbers) sum += number; } in
临时数组的生存期是构造函数的生存期,还是不保证 我的主要问题:
以下示例程序正确吗?
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);
}
类测试{
公众:
模板
测试(常量整数和数字)[N]){
用于(常量整数和编号:编号)
总和+=数字;
}
int getSum()常量{
回报金额;
}
私人:
整数和=0;
};
int main(){
测试测试({1,2,3});
断言(test.getSum()==6);
}
上面的代码运行良好,但是,我之所以问这个问题,是因为我在一个更大的项目中使用了相同的方法,其中数组的元素没有正确初始化
例如,如果将{16}
用作构造函数的参数,则有时数字[0]
的值是0b00000000000000000000010000
,这是正确的,有时它是不同的数字,例如0b11111111111111111100000
或0b00000000000000000001100010000
在我工作的微控制器平台上,
int
的大小是4个字节,当number[0]
出错时,我总是看到相同的模式:最低有效字节是正确的,但在3个最高有效字节中,总是有一个包含所有字节的块。这使我相信它没有正确初始化
我无法用一个小例子来隔离问题或重现它 在测试中({1,2,3})
,临时数组的生存期结束于代码>(在构造函数调用完成后)
所以您在构造函数中的用法是正确的
但是,如果您作为成员保留对该数组的引用,该引用将变得悬而未决。如果代码编译,我看不出有任何问题。您是否已尝试启用编译器警告?您正在使用哪个编译器?我注意到了中初始值设定项列表的编译器错误MSVC2015@JVApen,是的,它编译时没有警告。我正在使用arm-none-eabi-g++(适用于arm嵌入式处理器的GNU工具)5.4.1 20160919(发行版)[arm/Embedded-5-branch修订版240496]
好的,谢谢您的确认。那我就得去别处找我的虫子了。