繁体   English   中英

为什么我的数组初始值设定项不起作用,除非我为它创建一个单独的变量?

[英]Why does my array initializer not work unless I create a separate variable for it?

以下 C++ 代码编译时没有错误或警告,但由于某种原因,当我打印出 foo.arr 的内容时,我得到的只是垃圾值。 看起来数组成员没有被正确初始化。

template<int n> class C{
  public:
  const uint8_t (&arr)[n];
  const int length = n;
  C(const uint8_t (&arr_arg)[n]):arr(arr_arg)
  {}
};

int main() {
    C<5> foo{{1,2,3,4,5}};
    for(int i =0;i<foo.length;i++){      
      printf("foo.arr[%d]=%2x\r\n",i,foo.arr[i]);
    };
}

但是如果我这样写,当我打印出结果时,foo.arr 就被正确地初始化了。

int main() {
    const uint8_t x[]{1,2,3,4,5};
    C<5> foo{x};
    for(int i =0;i<foo.length;i++){      
      printf("foo.arr[%d]=%2x\r\n",i,foo.arr[i]);
    };
}

为什么第二种情况有效,而第一种情况无效?

人们会认为编译器会为常量数据 {1,2,3,4,5} 创建一个包含五个字节的块,然后 foo 的初始化程序会将 foo.arr 指向该字节块。 似乎 foo.arr 指向的不是数据所在的位置,或者在我打印出来时数据不再存在(可能被覆盖)。

C<5> foo{{1,2,3,4,5}};

构造函数的参数是对临时 object 的引用,该引用在构造函数调用完成后被销毁。 对此 object 的所有后续引用都会导致未定义的行为。

C<5> foo{x};

这里,构造函数的参数是对一个object的引用,这个引用保留在scope中,只要后续被引用和使用,它就一直存在。

似乎...数据在我打印出来时已经不存在了(可能被覆盖)。

这确实是正在发生的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM