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

标签 c++ c++20 c++-concepts

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*&>还在intstd::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++ - 在 C++20 中,什么时候应该使用 `iterator_traits<I>::value_type` ,什么时候应该使用 `iter_value_t` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68876199/

相关文章:

c++ - 为什么 fmt::format 不接受字符串作为参数?

c++ - 命名空间可以(是一个/满足一个)概念吗?

c++ - 概念要求和非直接上下文

c++ - 为什么我可以在 C++ 中的函数中定义结构和类?

c++ - #define XYZ before #include 预编译头文件

c++ - 将需要回调的函数调用转换为协程

c++ - 概念示例的简单 C++ 接口(interface)

c++ - 基于概念的模板成员函数重载

C++ 模板,链接错误

C++ CreateProcess() 在与第一个相同的窗口中运行