decltype () не работает для компилируемого шаблона класса - PullRequest
1 голос
/ 16 января 2020

У меня есть следующий фрагмент кода с проблемой. Я думаю, что компилятор не может определить тип c, потому что тип элементов values не будет известен до компиляции. Это верно?

vector values{1, 2, 3, 4, 5, 6};
vector<decltype(values[0])> {values};
ostream_iterator<int> printer{cout," "};
copy(ints.crbegin(),ints.crend(),printer);

1 Ответ

5 голосов
/ 16 января 2020

Проблема здесь в том, что values[0] - это int &. Убедитесь сами:

static_assert(std::is_same_v<decltype(values[0]), int &>);

Создание вектора ссылок - все это неправильно. Чтобы это исправить, просто используйте decltype для всего вектора.

std::vector values{1, 2, 3, 4, 5, 6};
decltype(values) ints(values.cbegin(), values.cend());

Для вашего примера, в действительности ничего этого не нужно, потому что вы просто копируете вектор. Так что вы можете просто сделать это:

std::vector ints = values;
// Or avoid CTAD entirely
auto ints = values;
...