我正在这样做:
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
的问题吗?
这里的问题是行
const auto foo = cbegin(arr);
cbegin(arr)
将返回一个int const *
(指向 const int 的指针),因此使用 const auto foo
将const
应用于该foo
意味着是一个int const * const
(指向 const int 的 const 指针)
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::decay
或std::remove_cv
const typename std::iterator_traits<std::remove_cv_t<decltype(foo)>>::value_type
(如果相关,请从foo
中删除const
)。
一个常量限定的迭代器const auto foo = cbegin(arr);
是值得怀疑的。对于无法应用operator++()
的迭代器,您有什么用?此外,迭代器要求类型int const *const
是可复制的;因此,变量foo
不满足迭代器要求。所以严格来说,foo
不是迭代器。