Почему я не могу создать массив автоматических переменных? - PullRequest
13 голосов
/ 18 августа 2011

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

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

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

Ответы [ 2 ]

10 голосов
/ 18 августа 2011

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?

5 голосов
/ 18 августа 2011

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

...