Почему я не могу получить value_type из iterator_traits? - PullRequest
0 голосов
/ 09 января 2019

Я делаю это:

const int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
const auto foo = cbegin(arr);
const typename iterator_traits<decltype(foo)>::value_type bar = 1;

Я бы ожидал, что bar будет иметь тип int. Но вместо этого я получаю сообщение об ошибке:

ошибка C2039: value_type: не является членом std::iterator_traits<_Ty *const >

Это проблема с const мне нужно раздеть это или что-то?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Действительно, const проблематично, вы делаете в основном:

std::iterator_traits<const int* const>::value_type // incorrect due to the last const

Вы можете исправить это, изменив значение на

std::iterator_traits<const int*>::value_type // Correct

Для этого вы можете использовать std::decay или std::remove_cv:

const typename std::iterator_traits<std::remove_cv_t<decltype(foo)>>::value_type

(или пропустите const из foo, если применимо).

0 голосов
/ 09 января 2019

Объявление const-квалифицированного итератора const auto foo = cbegin(arr); сомнительно. Как вы используете итератор, к которому вы не можете применить operator++()? Кроме того, требование Iterator требует, чтобы тип int const *const был Copy Assignable ; поэтому переменная foo не удовлетворяет требованию Iterator . Строго говоря, foo не является Итератором .

0 голосов
/ 09 января 2019

Проблема здесь со строкой

const auto foo = cbegin(arr);

cbegin(arr) вернет int const * (указатель на const int), поэтому применение const к этому с const auto foo означает, что foo равно int const * const (указатель const на const int)

std::iterator_traits специализируется только на T* или T const*, поэтому дать ему T* const не удастся, поскольку нет действительной специализации.

Это можно исправить, удалив константу в объявлении bar с помощью

const typename std::iterator_traits<std::remove_cv_t<decltype(foo)>>::value_type

или вы можете изменить foo на

auto foo = std::cbegin(arr);

если с тобой все в порядке, не будучи const.

...