假设:
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, "");
错误:
错误:没有名为&#39;
iterator_category
&#39;在&#39;std::__1::iterator_traits<Iter>
&#39;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
,{{1以下是可公开访问的成员: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;
将不具有上述任何名称的成员。
有人可以解释一下这是一个实施错误,还是为什么我的期望错了?