C++20 概念增加了 alternative way访问迭代器特征。例如 iter_value_t<I>
给出与 iterator_traits<I>::value_type
类似的结果.我注意到iterator_traits
似乎在概念约束中不起作用。iter_value_t
适用于概念,但也适用于其他任何地方。
所以我的预感是我应该使用较新的 iter_value_t
因为它适用于两种情况。
这样对吗?我什么时候应该更喜欢其中一个?
编辑:我失踪了 typename
在概念约束中使用 iterator_traits 时。这些概念让我感到不安!
最佳答案
您应该始终使用 std::iter_value_t<I>
.
首先,简单地考虑一下长度:
std::iter_value_t<I>
对比typename std::iterator_traits<I>::value_type
因为 value_type
是依赖类型,你需要额外的 typename
关键字,所以这是一口。其次,前者被简单地定义为比后者更多的情况。您通常会按值获取迭代器,因此这可能不是您遇到的大问题,但是
std::iter_value_t<int*&>
还在int
而 std::iterator_traits<int*&>::value_type
没有定义。与 std::iterator_traits<int* const>::value_type
相同.即,std::iterator_traits<I>::value_type
有效但 std::iterator_traits<I const>::value_type
或 std::iterator_traits<I&>::value_type
不要 - 您必须编写更多内容以确保您传递的是非引用、非 cv 限定类型。还有一些小的其他边缘情况,比如
std::iter_value_t<std::shared_ptr<int>>
是 int
但是 std::iterator_traits<std::shared_ptr<int>>::value_type
没有定义。因此,如果您正在编写一个算法,它采用任意间接可读的方法,但不一定是迭代器,您仍然可以使用它。因此,只需使用始终有效的简短内容,而不是有时不起作用的较长内容。
通常,
std::iter_reference_t<I>
比 std::iter_value_t<I>
有用得多, 也。
关于c++ - 在 C++20 中,什么时候应该使用 `iterator_traits<I>::value_type` ,什么时候应该使用 `iter_value_t` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68876199/