为什么不能从iterator_traits获取value_type?

时间:2019-01-09 15:23:44

标签: c++ types iterator typename 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。但是相反,我遇到了错误:

  

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

const是否有问题,我是否需要去除该东西?

3 个答案:

答案 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 * conststd::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::decaystd::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不是迭代器