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