2

我有一个测试用例,其中 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 的代码更改,但无法确定哪个版本完全修复了这个问题。有人可以指出确切的修订号吗?

4

0 回答 0