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