很明显,std :: initializer_list不是实际的容器。 该标准明确定义了使用std :: initializer_list可以做什么和不能做什么。
但为什么语言可以选择做愚蠢的事情,比如将一个临时的std :: initializer_list分配到另一个 - 当它可以很容易阻止时=删除std :: initializer_list的移动赋值运算符?
这是一个破解的代码示例,它编译:
void foo(std::initializer_list<int> v) {
std::cout << *v.begin() << std::endl;
}
int main() {
int a = 1, b = 2, c = 3;
auto val = {a, b, c}; // ok, extending the lifetime of {a, b, c}
foo(val); // prints ok
int i = 7;
val = {i}; // doesn't handle well assignment of temporary
foo(val); // prints garbage...
}
Output,由@nwp提供:
1
-365092848