为什么我不能从 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::decay
或 std::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 *const
为 Copy Assignable;因此,变量 foo
不满足 Iterator 要求。所以严格来说,foo
不是 Iterator.
我正在这样做:
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 ofstd::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::decay
或 std::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 *const
为 Copy Assignable;因此,变量 foo
不满足 Iterator 要求。所以严格来说,foo
不是 Iterator.