根据 C++ 标准草案,执行std::iter_value_t必须是:
\n\n使用 iter_value_t 的模板=见下文;
\n让 RI 成为
\nremove_cvref_t<I>。类型iter_value_t<I>表示(2.1)\xe2\x80\x94
\nindirectly_readable_traits<RI >::value_type如果iterator_traits<RI>命名从主模板生成的专业化,并且(2.2)\xe2\x80\x94
\niterator_traits<RI >::value_type否则。
我明白那个:
\ntype iter_value<T>: // OK, this is not C++, is to clarify my question\n type R = remove_cvref_t<T>;\n if (iterator_traits<R> is a specialization of iterator_traits)\n return indirectly_readable_traits<R>::value_type;\n else\n return iterator_traits<R>::value_type;\nRun Code Online (Sandbox Code Playgroud)\n但在cppreference中,实现必须是:
\n\n\n计算
\nvalue typeT 的 。如果std::iterator_traits<std::remove_cvref_t<T>>不是专门化的,则为std::iter_value_t<T>。std::indirectly_readable_traits<std::remove_cvref_t<T>>::value_type\n否则为std::iterator_traits<std::remove_cvref_t<T>>::value_type。
所以实现它的代码必须是
\ntype iter_value<T>:\n type R = remove_cvref_t<T>;\n if (iterator_traits<R> is a specialization of iterator_traits)\n return iterator_traits<R>::value_type;\n else \n return indirectly_readable_traits<R>::value_type;\nRun Code Online (Sandbox Code Playgroud)\n所以,根据我的理解,这两个定义std::iter_value_t是不同的。哪一个是正确的?(我想是第二个)。
但是,由于我不会说英语,所以问题很可能出在我的英语上。因此,如果您能澄清其含义,我将不胜感激。
\n参考资料:c++标准
\n你的理解被颠覆了。
if
iterator_traits<RI>命名从主模板生成的专业化
主模板是
template< class Iter >
struct iterator_traits;
Run Code Online (Sandbox Code Playgroud)
并不是
template</* possibly params */>
struct iterator_traits</* stuff here */>;
Run Code Online (Sandbox Code Playgroud)
使用术语“ NOT Specialized”表示“使用主模板”与 cppreference 存在一些混淆。当您实例化模板时,您总是会从主模板或声明的专业化中获得专业化。