C++ 标准有问题(或者很可能是我不太懂英语)

Ant*_*nio 1 c++ c++20 c++23

根据 C++ 标准草案,执行std::iter_value_t必须是:

\n
\n

使用 iter_value_t 的模板=见下文;

\n

让 RI 成为remove_cvref_t<I>。类型iter_value_t<I>表示

\n

(2.1)\xe2\x80\x94indirectly_readable_traits<RI >::value_type如果iterator_traits<RI>命名从主模板生成的专业化,并且

\n

(2.2)\xe2\x80\x94iterator_traits<RI >::value_type否则。

\n
\n

我明白那个:

\n
type 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;\n
Run Code Online (Sandbox Code Playgroud)\n

但在cppreference中,实现必须是:

\n
\n

计算value 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

\n
\n

所以实现它的代码必须是

\n
type 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;\n
Run Code Online (Sandbox Code Playgroud)\n

所以,根据我的理解,这两个定义std::iter_value_t是不同的。哪一个是正确的?(我想是第二个)。

\n

但是,由于我不会说英语,所以问题很可能出在我的英语上。因此,如果您能澄清其含义,我将不胜感激。

\n

参考资料:c++标准

\n

Cal*_*eth 5

你的理解被颠覆了。

ifiterator_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 存在一些混淆。当您实例化模板时,您总是会从主模板或声明的专业化中获得专业化。