【发布时间】:2021-08-14 16:59:22
【问题描述】:
在[alg.unique]中,ranges::unique_copy的签名定义为:
template<input_iterator I, sentinel_for<I> S, weakly_incrementable O, class Proj = identity,
indirect_equivalence_relation<projected<I, Proj>> C = ranges::equal_to>
requires indirectly_copyable<I, O> &&
(forward_iterator<I> ||
(input_iterator<O> && same_as<iter_value_t<I>, iter_value_t<O>>) ||
indirectly_copyable_storable<I, O>)
constexpr ranges::unique_copy_result<I, O>
ranges::unique_copy(I first, S last, O result, C comp = {}, Proj proj = {});
但是我发现当I只是一个input_iterator而O只是一个output_iterator时,下面的代码编译失败:
std::istringstream str("42 42 42");
std::ranges::unique_copy(
std::istream_iterator<int>(str),
std::istream_iterator<int>(),
std::ostream_iterator<int>(std::cout, " "));
gcc 和 msvc 都使用 (godbolt) 拒绝它:
error: no type named 'value_type' in 'using type = struct std::indirectly_readable_traits<std::ostream_iterator<int> >' {aka 'struct std::indirectly_readable_traits<std::ostream_iterator<int> >'}
1436 | && same_as<iter_value_t<_Iter>, iter_value_t<_Out>>)
奇怪的是,这里的错误信息并没有显示constraints not satisfied,它只是在实例化same_as<iter_value_t<_Iter>, iter_value_t<_Out>时抱怨indirectly_readable_traits<ostream_iterator<int>>中没有value_type。
为什么上面的代码在 C++20 中格式不正确?
【问题讨论】: