为什么 make_reverse_iterator(make_reverse_iterator(it)) 导致不同的类型?

Is there a reason why make_reverse_iterator(make_reverse_iterator(it)) results in a different type?

我认为:

static_assert(is_same_v<
    decltype(make_reverse_iterator(make_reverse_iterator(it)))
  , decltype(it)>);

会编译,但不会。这有什么原因吗?我认为这可能会导致在编写模板时生成更大的代码。

这并不难实现:

template <typename T>
T make_reverse_iterator(reverse_iterator<T> it) {
  return it.base();
}

如果在调用模板函数时进行两次或更多次反转,将导致更小的二进制文件,特别是如果该函数要说使用它所调用的 reverse_iterator 递归地调用自身而不复杂化具有其他专业的代码。

有一个简单的问题,其答案解释了这一点:

make_reverse_iterator 的 return 值是 reverse_iterator 吗?

看,反向迭代器不仅仅是一个向后运行的迭代器。是一种类型。或者更确切地说,它是一个生成一系列类型的模板。并且该模板有望提供某些行为;该行为使其成为反向迭代器。

这是非 reverse_iterator 类型不需要提供的行为。 reverse_iterator<reverse_iterator<I>>I 不同。例如,您无法获取 Ibase

如果用户调用 make_reverse_iterator,他们有权期望获得 reverse_iterator,并拥有该模板提供的所有权力和特权。对 return 来说,其他任何事情都等同于对用户撒谎。

您似乎想要的是 make_iterator_go_backwards:一个 return 某种迭代器类型的函数,该迭代器类型向后遍历序列。这是一件值得期待的事情。

但是那个东西不是拼写的make_reverse_iterator。如果您有一个名为 make_some_type 的函数,它应该 return some_type.