libddc ++和libc ++之间的std :: iterator_traits差异

时间:2017-11-27 15:00:24

标签: c++ language-lawyer libc++ compiler-bug iterator-traits

假设:

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_­typevalue_­typepointerreferenceiterator_­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; 将不具有上述任何名称的成员。

有人可以解释一下这是一个实施错误,还是为什么我的期望错了?

0 个答案:

没有答案