iterator_const_reference_t 的实现如下:
template<std::indirectly_readable T>
using iter_const_reference_t = std::common_reference_t<const std::iter_value_t<T> &&,
std::iter_reference_t<T>>;
但为什么?为什么不简单地说:std::add_const_t<std::iter_reference_t<T>>
?
add_const_t<int&>
仍然是int&
,这不是 const 引用。您可能是说const iter_value_t<T>&
但这可能会导致悬而未决的问题。您问题中的公式来自 range/v3,它已经存在多年,可以处理几乎所有情况,包括代理引用。
例如,
zip_view
的迭代器的引用,即tuple<int&, int&>
,不能仅通过添加顶级 -const
限定符而成为 const 引用。在这种情况下,我们可以应用
common_reference
的专门化来tuple
生成正确的引用类型tuple<const int&, const int&>
,即 ,这就是公式iter_const_reference_t
具有common_reference
部分的原因。