我正在这样做:
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
是否有问题,我是否需要去除该东西?
答案 0 :(得分:19)
这里的问题是线
run
const auto foo = cbegin(arr);
将返回cbegin(arr)
(指向const int的指针),因此将int const *
应用于const
意味着const auto foo
是{{1 }}(指向const int的const指针)
foo
仅适用于int const * const
或std::iterator_traits
,因此,由于没有有效的专门化条件,因此给它T*
失败。
您可以通过以下方式解决此问题:使用{p>删除T const*
声明中的常数
T* const
或者您可以将bar
更改为
const typename std::iterator_traits<std::remove_cv_t<decltype(foo)>>::value_type
如果您还可以接受foo
,就可以了。
答案 1 :(得分: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::decay
或std::remove_cv
const typename std::iterator_traits<std::remove_cv_t<decltype(foo)>>::value_type
(或从const
中删除foo
(如果相关)。
答案 2 :(得分:1)
声明常量限定的迭代器const auto foo = cbegin(arr);
是可疑的。对于不能应用operator++()
的迭代器有什么用?此外,迭代器要求还要求类型int const *const
为可分配复制;因此,变量foo
不满足 Iterator 的要求。因此严格来说,foo
不是迭代器。