While thinking about solution for question std::initializer list from already existing std::array without enumerating each element, I developed similar mechanism as bolov did, but not constructing the object, but rather only initializer list. I was surprised that my solution did not work and I couldn't figure out why.
#include <initializer_list>
#include <iostream>
#include <array>
template<typename T, std::size_t N, std::size_t... Is>
std::initializer_list<T> array_to_init_list_helper(std::array<T, N> arr, std::index_sequence<Is...>)
{
return {arr[Is]...};
}
template<typename T, std::size_t N>
std::initializer_list<T> array_to_init_list(std::array<T, N> arr)
{
return array_to_init_list_helper(arr, std::make_index_sequence<N>{});
}
int main()
{
std::array<int, 5> arr{1, 2, 3, 4, 5};
auto init_list = array_to_init_list(arr);
for (auto val : init_list)
std::cout << val << " ";
}
I am getting random values, while I would expect to get values of arr.
std::initializer_listis not a container - it's basically just a pair of pointers. In effect,array_to_init_list_helperreturns pointers to local variables. From the article: "Copying astd::initializer_listdoes not copy the underlying objects."