初始化列表中的对象的生存期可以延长吗?

时间:2018-12-15 09:01:27

标签: c++ c++11 lifetime initializer-list const-reference

我的印象是std::initializer_list的行为可能类似于C ++中的文字字符串,甚至更进一步,它们可能会延长const引用的寿命。那是正确的评估吗?

以后可以在本地范围内以某种方式引用 initializer_list中的对象吗(不复制它们)?在全球范围内?

例如,此测试在GCC和clang中通过。 只是偶然吗?

#include<cassert>
#include<initializer_list> 
struct A{
    double const* p;
    A(std::initializer_list<double> il){ p = &*(il.begin() + 1); };
};
double f(){return 5.;}
int main(){
   A a1{1.,2.,3.};
   assert( *a1.p == 2. );
   A a2{1., f(), f()};
   assert( *a2.p == 5. );
}

1 个答案:

答案 0 :(得分:4)

这是不确定的行为。

在您的情况下,initializer_list指向临时数组const double[3],该数组的生存期描述如下:

  

ref   不能保证基础数组在存在之后就存在   原始的初始化程序列表对象已结束。 [直到c ++ 14]

     

基础数组的生存期与其他任何生存期相同   临时对象[自c ++ 14起]

  

ref所有临时对象都被销毁,这是评估对象的最后一步   充分表达

因此,在您的情况下,当调用A的构造函数时,将创建具有3个双精度值的临时数组,然后您将获取临时数组的元素地址,并且当构造函数结束时,临时数组将被销毁(在这种情况下,表达式是ctor的调用),因此p悬而未决。