You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:41:04