在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_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>。