13

我正在这样做:

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有 type int。但相反,我收到了一个错误:

错误 C2039: value_type: 不是std::iterator_traits<_Ty *const >

这是const我需要剥离它还是什么的问题?

4

3 回答 3

19

这里的问题在于这条线

const auto foo = cbegin(arr);

cbegin(arr)将返回一个int const *(指向 const int 的指针),因此使用手段应用于const它的是一个(指向 const int 的常量指针)const auto foofooint const * const

std::iterator_traits因为没有有效的特化,所以只针对 aT*T const*so 给它一个失败。T* const

bar您可以通过删除with声明中的常量来解决此问题

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

或者您可以更改foo

auto foo = std::cbegin(arr);

如果你不介意的话const

于 2019-01-09T15:31:56.620 回答
8

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

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

您可以通过将其更改为来修复它

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

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

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

const(或者如果相关的话,放弃foo)。

于 2019-01-09T15:32:34.890 回答
1

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

于 2019-01-09T16:57:45.320 回答