https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102573
--- Comment #4 from wjf <13508417 at qq dot com> --- Hi Andrew, I've updated my gcc to 10.2.1, and find while it did show what you said for my initial code snippet, it won't warn me anything, nor report error at runtime with -fsanitize=address (note that clang version 10.0.0 will report error at runtime however), for below two code snippets: ---- code 1: #include<iostream> #include<initializer_list> using namespace std; int main() { initializer_list<int> il({111, 222}); cout << "initializer_list size: " << il.size() << endl; cout << "initializer_list underlying elements: " << endl; for (auto i : il) cout << i << endl; return 0; } ---- code 2: #include<iostream> #include<initializer_list> using namespace std; int main() { initializer_list<int> il; { initializer_list<int> il2 = {111, 222}; il = il2; } cout << "initializer_list size: " << il.size() << endl; cout << "initializer_list underlying elements: " << endl; for (auto i : il) cout << i << endl; return 0; } ---- As you can see, above two code snippets should still have the similar "lifespan" issue. code 1's il constructs from an temporary, but doesn't extend the lifetime of the underlying array. code 2's il is assigned from il2, but have longer lifetime than il2. When using clang++ optimization, the output will be something like below: initializer_list size: 2 initializer_list underlying elements: 1877862544 32767