Почему в std::ranges делается так, что я не могу разделить диапазон, полученный в результате соединения с преобразованиеC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему в std::ranges делается так, что я не могу разделить диапазон, полученный в результате соединения с преобразование

Сообщение Anonymous »

Почему в std::ranges делается так, что я не могу разделить диапазон, полученный в результате объединения с преобразованием
Почему этот код не компилируется и как это исправить он все еще использует декларативный подход с std::ranges и не создает промежуточные не ленивые контейнеры как std::vector после преобразования?
auto Foo(std::vector viewsVec) -> void {
std::println("{}",
viewsVec | std::views::transform([](std::string_view str) -> std::string_view {
return str.substr(1);
}) | std::views::join |
std::views::split('\n'));
}

Я получаю следующую ошибку компиляции:
clang++ -std=c++23 Split.cpp
split.cpp:10:38: error: invalid operands to binary expression ('invoke_result_t' (aka
'std::ranges::join_view') and
'__range_adaptor_closure_t' (aka
'std::ranges::__range_adaptor_closure_t'))
8 | viewsVec | std::views::transform([](std::string_view str) -> std::string_view {
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9 | return str.substr(1);
| ~~~~~~~~~~~~~~~~~~~~~
10 | }) | std::views::join |
| ~~~~~~~~~~~~~~~~~~~~~ ^
11 | std::views::split('\n'));
| ~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/v1/cstddef:73:45: note: candidate function not viable: no known conversion from 'invoke_result_t' (aka
'std::ranges::join_view') to 'byte' for 1st
argument
73 | _LIBCPP_HIDE_FROM_ABI inline constexpr byte operator|(byte __lhs, byte __rhs) noexcept {
| ^ ~~~~~~~~~~
/usr/include/c++/v1/__charconv/chars_format.h:34:53: note: candidate function not viable: no known conversion from 'invoke_result_t' (aka
'std::ranges::join_view') to 'chars_format' for
1st argument
34 | inline _LIBCPP_HIDE_FROM_ABI constexpr chars_format operator|(chars_format __x, chars_format __y) {
| ^ ~~~~~~~~~~~~~~~~
/usr/include/c++/v1/__ranges/range_adaptor.h:71:1: note: candidate template ignored: constraints not satisfied [with _Range =
invoke_result_t, _Closure =
__range_adaptor_closure_t]
71 | operator|(_Range&& __range, _Closure&& __closure) noexcept(is_nothrow_invocable_v) {
| ^
/usr/include/c++/v1/__ranges/range_adaptor.h:69:12: note: because
'invocable' evaluated to false
69 | requires invocable
| ^
/usr/include/c++/v1/__concepts/invocable.h:28:3: note: because 'std::invoke(std::forward(__fn), std::forward(__args)...)' would be
invalid: no matching function for call to 'invoke'
28 | std::invoke(std::forward(__fn), std::forward(__args)...); // not required to be equality preserving
| ^
/usr/include/c++/v1/__ranges/range_adaptor.h:77:52: note: candidate template ignored: constraints not satisfied [with _Closure =
invoke_result_t, _OtherClosure =
__range_adaptor_closure_t]
77 | [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr auto operator|(_Closure&& __c1, _OtherClosure&& __c2) noexcept(
| ^
/usr/include/c++/v1/__ranges/range_adaptor.h:75:11: note: because
'std::ranges::join_view' does not satisfy
'_RangeAdaptorClosure'
75 | template
| ^
/usr/include/c++/v1/__ranges/range_adaptor.h:62:32: note: because
'!ranges::range' evaluated to
false
62 | concept _RangeAdaptorClosure = !ranges::range && requires {
| ^
1 error generated.

clang --version:
clang version 19.1.0+libcxx
Target: x86_64-pc-linux-musl
Thread model: posix
InstalledDir: /usr/lib/llvm/19/bin
Configuration file: /etc/clang/x86_64-pc-linux-musl-clang.cfg


Подробнее здесь: https://stackoverflow.com/questions/790 ... -from-join
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»