Подтвердить что ты не робот

Почему я не могу создать массив автоматических переменных?

В С++ 0x (ohh! read С++ 11) у нас есть автоматический вывод типа. Одна вещь, которая вызывала у меня любопытство, заключалась в том, что я не могу создать массив автоматических переменных. Например:

auto A[] = {1, 2, 3, 4}; // Error!

Любые идеи, почему это могло быть запрещено?

4b9b3361

Ответ 1

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

Ну, по-видимому, вы можете пойти на хакерство с вариационным шаблоном, упомянутое здесь Как инициализировать массив-член с помощью initializer_list?

Ответ 2

Потому что {1, 2, 3, 4} является чисто синтаксической конструкцией - это не выражение и не имеет типа. Поэтому auto не может выводить из него свой тип.