auto
выводит каждый заключенный в скобки список инициализаторов в std::initializer_list<T>
. (См. §7.1.6.4.6, включая пример).
К сожалению, вы не можете инициализировать массив или даже std::array
из std::initializer_list
, как только вы его получили, но вы можете использовать std::vector
.
#include <vector>
#include <array>
#include <initializer_list>
int main()
{
auto x = {1,2,3};
std::array<int, 3> foo1 = x; // won't work for whatever reason
std::vector<int> foo2 = x; // works as expected
return 0;
}
Конечно, это разрушает всю цель того, что вы пытаетесь сделать.
Я попытался написать работу под названием make_array
, но должен был понять, что это никогда не сработает, поскольку размер initializer_list
не является частью аргументов шаблона, и поэтому вы создаете только один шаблон make_array
для каждого T
. Это отстой.
template<typename T>
auto make_array(const std::initializer_list<T>& x)
-> std::array<T, x.size()> { } // maaah
Ну, по-видимому, вы можете пойти на хак с использованием variadic-шаблона, упомянутый здесь Как мне инициализировать массив элементов с помощью initializer_list?