鉴于:
struct Iter {
using value_type = int;
using difference_type = int;
using reference = int;
using pointer = int;
using iterator_category = int;
};
以下内容适用于 libstc++,但无法针对 libc++ 5.0.0 进行编译:
#include <iterator>
#include <type_traits>
static_assert(
std::is_same<
std::iterator_traits<Iter>::iterator_category,
Iter::iterator_category
>::value, "");
出现错误:
错误: ' ' 中没有名为 '
iterator_category
' 的std::__1::iterator_traits<Iter>
成员std::is_same<std::iterator_traits<Iter>::iterator_category, Iter::iterator_category>::value, "");
如果Iter::iterator_category
是标准输入类别之一,则静态断言成功,例如std::input_iterator_tag
。
恕我直言,它不应该失败,因为 C++ 草案在[iterator.traits]#2中声明:
如果 Iterator 具有有效的 ( [temp.deduct] ) 成员类型
difference_type
、value_type
、pointer
、reference
和iterator_category
,iterator_traits<Iterator>
则应具有以下作为可公开访问的成员:using difference_type = typename Iterator::difference_type; using value_type = typename Iterator::value_type; using pointer = typename Iterator::pointer; using reference = typename Iterator::reference; using iterator_category = typename Iterator::iterator_category;
否则,
iterator_traits<Iterator>
不得有上述任何名称的成员。
任何人都可以解释这是否是一个实现错误,或者为什么我的期望是错误的?