为何std::ranges::transform_view::iterator不满足InputIterator要求?
问题:transform_view迭代器为何无法适配vector的insert(InputIt)重载?
#include <string> #include <ranges> #include <vector> std::vector<std::string> fields; void insert_many(std::size_t pos, std::span<std::string> keys) { auto view = std::views::iota(0uz, keys.size()) | std::views::transform([&](std::size_t i) { return std::move(keys[i]); }); static_assert(std::ranges::input_range<decltype(view)>); fields.insert(fields.cbegin() + pos, view.begin(), view.end()); }
*注:*该示例由更复杂的代码简化而来。我清楚此处完全不需要使用std::views::iota,问题核心是当前形式的代码为何无法运行。
在libc和libstdc中,static_assert均能通过,但只有libc++允许调用insert函数。我尝试匹配的是vector的如下重载:
template< class InputIt > constexpr iterator insert( const_iterator pos, InputIt first, InputIt last );
从libstdc++的错误信息来看,std::ranges::transform_view::iterator不满足InputIterator的要求,因此无法匹配该重载:
/opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/15.0.0/../../../../include/c++/15.0.0/bits/stl_vector.h:1484:2: note: candidate template ignored: requirement 'is_convertible<std::output_iterator_tag, std::input_iterator_tag>::value' was not satisfied [with _InputIterator = _Iterator<false>] 1484 | insert(const_iterator __position, _InputIterator __first, | ^
这是预期行为吗?我原以为新的std::views相关组件也满足遗留迭代器的要求。
内容的提问来源于stack exchange,提问作者Jan Schultke
相关产品推荐
相关产品推荐

