decltype для элемента std :: vector - PullRequest
0 голосов
/ 08 апреля 2020

Почему следующее не компилируется?

  std::vector<int> v{1,2};
  decltype(v[0]) i;           //doesn't work
  decltype(v)::value_type j;  //works

Я получаю ошибку test.cpp:31:18: error: declaration of reference variable 'i' requires an initializer. Разве v[0] типа int здесь нет?

Я понимаю, что даже если бы он работал, он был бы не так безопасен, как последний, если вектор пуст, но я чувствую, что это должно быть проблемой времени выполнения, а не проблемой времени компиляции.

1 Ответ

1 голос
/ 08 апреля 2020

decltype(v[0]) возвращает тип выражения v[0], который является ссылкой на элемент (если v не равно vector<bool>). Ссылочная переменная должна быть инициализирована, и это то, о чем говорит сообщение об ошибке компилятора.

Вы можете использовать auto, чтобы получить элемент по значению, и auto&, чтобы получить его по ссылке:

auto element = v[0];
auto& element_ref = v[0];
...