std::intializer_list
永远拷贝
#include <iostream>
#include <string>
#include <vector>
void* operator new(size_t s) {
std::cout << s << '\n';
return malloc(s);
}
int main() {
auto v = std::vector<std::string>{"abbbbbbbbbbbbbbbbbbbbbbbbbbbb", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"};
}
prints
30 // "ab....." allocates
33 // "bb....." allocates
64 // vector allocates
30 // "ab....." copied to init list
33 // "bb....." copied to init list
5 allocations
std::initializer_list
只应该被用在拷贝很便宜的情境下
但是
#include <initializer_list>
#include <iostream>
template <int ... Args>
auto foo() {
return std::initializer_list<int>{Args...}; // UB
}
int main() {
for (auto i : foo<1, 2, 3>()) {
std::cout << i;
}
}
因为std::initializer_list
永远拷贝,所以foo
返回的实际是一个指向局部变量的view,gcc和clang都会给出类似警告
returning address of local temporary object