【发布时间】:2019-06-04 09:59:51
【问题描述】:
我正在这样做:
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 的问题,我需要去掉它吗?
【问题讨论】:
-
我通常为此使用
std::decay。不过,我不愿意将此作为答案发布,因为我并不完全理解为什么它似乎可以解决所有这些问题。所以它可能不是正确的解决方案。你会写const typename std::iterator_traits<std::decay_t<decltype(foo)>>::value_type bar = 1;。 -
@FrançoisAndrieux 是的,我希望我可以为
vector或数组工作...decay会 仍然可以在那里工作...所以也许这是最好的? -
@JonathanMee 它也适用于非指针迭代器类型。以我的经验,它每次都能解决这类问题并且神奇地起作用。尽管如此,它对我来说似乎很神奇的事实让我对推荐它感到紧张。
-
@FantasticMrFox 该更改旨在处理
volatile T*。它不会为T* const添加专业化。
标签: c++ types iterator typename iterator-traits