为什么我不能从 iterator_traits 得到 value_type?

Why can't I get value_type from iterator_traits?

我正在这样做:

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 类型。但是我收到了一个错误:

error C2039: value_type: is not a member of std::iterator_traits<_Ty *const >

这是 const 的问题吗,我需要去掉那个还是什么?

这里的问题是行

const auto foo = cbegin(arr);

cbegin(arr) 将要 return 一个 int const * (指向 const int 的指针)因此将 const 应用于 const auto foo 意味着 foo 是一个 int 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

确实const有问题,你基本上是这样的:

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

您可以通过将其更改为

来修复它
std::iterator_traits<const int*>::value_type // Correct

您可以使用 std::decaystd::remove_cv

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

(或从 foo 中删除 const(如果相关)。

声明一个 const 合格的迭代器 const auto foo = cbegin(arr); 是有问题的。不能应用 operator++() 的迭代器有什么用?此外,Iterator 要求要求类型 int const *constCopy Assignable;因此,变量 foo 不满足 Iterator 要求。所以严格来说,foo 不是 Iterator.