在C++20中什么时候应该使用`iterator_traits<I>::value_type`,什么时候应该使用`iter_value_t`?

C++20 概念添加了一种访问迭代器特征的替代方法。例如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_typestd::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++20中什么时候应该使用`iterator_traits&lt;I&gt;::value_type`,什么时候应该使用`iter_value_t`?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>