【发布时间】:2018-05-10 20:50:51
【问题描述】:
给定:
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, "");
出现错误:
错误:“
std::__1::iterator_traits<Iter>”中没有名为“iterator_category”的成员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>将没有上述任何名称的成员。
谁能解释这是否是一个实现错误,或者为什么我的期望是错误的?
【问题讨论】:
-
在我解释标准时,唯一有效的 iterator_cathegory 类型是 input_iterator_tag、output_iterator_tag、forward_iterator_tag、bidirectional_iterator_tag 和 random_access_iterator_tag。如果 iterator_cathegory 有另一个值,则该迭代器没有有效的 iterator_cathegory 类型,因此该迭代器的 iterator_traits 应该没有任何指定的成员。
标签: c++ language-lawyer libc++ compiler-bug iterator-traits