延长initlist的生命周期

时间:2013-10-10 13:54:52

标签: c++ c++11 clang llvm initializer-list

我有一个测试用例,其中延长了initlist的生命周期。

#include <initializer_list> 
extern "C" void abort();
bool ok; 
bool do_throw; 
struct A { 
    A(int) { 
    if (do_throw) throw 42; 
    } 
    ~A() { 
     if (!ok) abort(); 
     } 
   }; 

 typedef std::initializer_list<A> AL;
 typedef std::initializer_list<AL> AL2; 
 typedef std::initializer_list<AL2> AL3; 

 struct B { 
      AL al; 
      const AL& alr; 
     }; 

 int main(int argc, const char** argv) {
   do_throw = (argc > 1);        // always false, but optimizer can't tell 
   AL ar[] = {{1,2},{3,4}};  
   B b = {{5,6},{7,8}}; 
   AL3 al3 = {{{1},{2},{3}}}; 
   ok = true; 
   } 

这里,对象b的初始化应该成功,因为它的子对象al(它是一个初始化列表)的生命周期被扩展。当我使用gcc编译代码时它成功,但是clang 3.3抛出错误。 Clang 3.4成功了。我完成了从clang 3.3到3.4的代码更改,但无法确定哪个版本完全修复了这个问题。有人能指出确切的修订号吗?

0 个答案:

没有答案