Проблема здесь со строкой
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
.