Eu tenho o seguinte código ( https://godbolt.org/z/K7sPbjjKE ):
#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());
}
Nota: Este exemplo é simplificado demais em https://godbolt.org/z/hYTjsohTf . Eu sei, você não precisa usar std::views::iota
nada aqui. A questão é por que o código em sua forma atual não funciona.
Tanto no libc++ quanto no libstdc++, os static_assert
passes. No entanto, apenas libc++ permite a chamada para insert
. estou tentando ligar
template< class InputIt > constexpr iterator insert( const_iterator pos, InputIt first, InputIt last );
Pela aparência da mensagem de erro (com libstdc++), std::ranges::transform_view::iterator
não satisfaz InputIterator , portanto a sobrecarga não pode ser chamada:
/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, | ^
Esse é o comportamento pretendido? Achei que o novo std::views
material também satisfazia os requisitos do iterador legado.