Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用初始值设定项列表将常量数组引用实例化为构造函数参数,是否允许?_C++_Arrays - Fatal编程技术网

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]
好的,谢谢您的确认。那我就得去别处找我的虫子了。