Spec-Zone.ru › C++

std::ranges::views::as_rvalue, std::ranges::as_rvalue_view

Определён в заголовочном файле <ranges>
template< ranges::view V >
    requires ranges::input_range<V>
class as_rvalue_view
    : public ranges::view_interface<as_rvalue_view<V>>
(1) (начиная с C++23)
namespace views {
    inline constexpr /* unspecified */ as_rvalue = /* unspecified */;
}
(2) (начиная с C++23)
Сигнатура вызова
template< ranges::viewable_range R >
    requires /* see below */
constexpr ranges::view auto as_rvalue( R&& r );
(начиная с C++23)
1) Адаптер диапазона, представляющий представление базового view, элементы которого являются rvalue.
2) Объект-адаптер диапазона. Пусть e является подвыражением, а T — decltype((e)). Тогда выражение views::as_rvalue(e) эквивалентно выражению:
  • views::all(e), если это корректное выражение, T удовлетворяет требованиям input_range, а std::same_as<ranges::range_rvalue_reference_t<T>, ranges::range_reference_t<T>> является true;
  • as_rvalue_view{e} в противном случае.

Члены-данные

Член Описание
V base_ (закрытый) базовое представление
(только для описания, объект-член*)

Функции-члены

(конструктор)
создаёт as_rvalue_view
(открытая функция-член)
base
возвращает базовое представление V
(открытая функция-член)
begin
возвращает итератор начала as_rvalue_view
(открытая функция-член)
end
возвращает итератор конца as_rvalue_view
(открытая функция-член)
size
возвращает размер представления, если оно ограничено
(открытая функция-член)
reserve_hint
(C++26)
возвращает приблизительный размер базового approximately_sized_range
(открытая функция-член)
Унаследовано от std::ranges::view_interface
empty
возвращает, является ли производное представление пустым; доступна только в том случае, если оно удовлетворяет требованиям sized_range или forward_range
(открытая функция-член std::ranges::view_interface<D>)
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает сентинел для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)
operator bool
возвращает, не является ли производное представление пустым; доступна только в том случае, если к нему применим ranges::empty
(открытая функция-член std::ranges::view_interface<D>)
front
возвращает первый элемент производного представления, если оно удовлетворяет требованиям forward_range
(открытая функция-член std::ranges::view_interface<D>)
back
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет требованиям bidirectional_range и common_range
(открытая функция-член std::ranges::view_interface<D>)
operator[]
возвращает элемент производного представления с индексом n-м; доступна только в том случае, если оно удовлетворяет требованиям random_access_range
(открытая функция-член std::ranges::view_interface<D>)

std::ranges::as_rvalue_view::as_rvalue_view

as_rvalue_view() requires std::default_initializable<V> = default;
(1) (начиная с C++23)
constexpr explicit as_rvalue_view( V base );
(2) (начиная с C++23)
1) Инициализирует base_ значением по умолчанию с помощью его инициализатора-члена по умолчанию (= V()).
2) Инициализирует base_ значением std::move(base).

Параметры

base - представление

std::ranges::as_rvalue_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (начиная с C++23)
constexpr V base() &&;
(2) (начиная с C++23)

Возвращает базовое представление.

1) Копирующе конструирует результат из базового представления. Эквивалентно return base_ ;.
2) Перемещающе конструирует результат из базового представления. Эквивалентно returnstd::move(base_ );.

std::ranges::as_rvalue_view::begin

constexpr auto begin() requires (!/*simple-view*/<V>);
(1) (начиная с C++23)
constexpr auto begin() const requires ranges::range<const V>;
(2) (начиная с C++23)

Возвращает std::move_iterator(ranges::begin(base_ )).

std::ranges::as_rvalue_view::end

constexpr auto end() requires (!/*simple-view*/<V>);
(1) (начиная с C++23)
constexpr auto end() const requires ranges::range<const V>;
(2) (начиная с C++23)

Возвращает std::move_iterator(ranges::end(base_ )), если (1) V или (2) constV удовлетворяет требованиям common_range.

В противном случае возвращает std::move_sentinel(ranges::end(base_ )).

std::ranges::as_rvalue_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (начиная с C++23)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (начиная с C++23)

Возвращает размер представления, если оно ограничено. Эквивалентно returnranges::size(base_ );.

std::ranges::as_rvalue_view::reserve_hint

constexpr auto reserve_hint()
    requires ranges::approximately_sized_range<V>;
(1) (начиная с C++26)
constexpr auto reserve_hint() const
    requires ranges::approximately_sized_range<const V>;
(2) (начиная с C++26)

Возвращает ranges::reserve_hint(base_ ).

Руководства по выводу типов

template< class R >
as_rvalue_view( R&& ) -> as_rvalue_view<views::all_t<R>>;
(начиная с C++23)

Вспомогательные шаблоны

template< class T >
constexpr bool enable_borrowed_range<std::ranges::as_rvalue_view<T>> =
    ranges::enable_borrowed_range<T>;
(начиная с C++23)

Эта специализация ranges::enable_borrowed_range обеспечивает соответствие as_rvalue_view требованиям borrowed_range, если базовое представление им удовлетворяет.

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_ranges_as_rvalue 202207L (C++23) std::ranges::as_rvalue_view
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range и reserve_hint

Пример

#include <algorithm>
#include <iostream>
#include <ranges>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> words =
        {"Quick", "red", "\N{FOX FACE}", "jumped", "over", "a", "pterodactyl"};
    std::vector<std::string> new_words;

    std::ranges::copy(
        words | std::views::as_rvalue,
        std::back_inserter(new_words)); // move string from words into new_words

    auto quoted = std::views::transform([](auto&& s) { return "“" + s + "”"; });

    std::cout << "Old words: ";
    for (auto&& word : words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';

    std::cout << "\nNew words: ";
    for (auto&& word : new_words | std::views::as_rvalue | quoted)
        std::cout << word << ' ';
}

Возможный вывод:

Old words: “” “” “” “” “” “” “” 
New words: “Quick” “red” “🦊” “jumped” “over” “a” “pterodactyl”

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

Отчёт об ошибке Применяется к Опубликованное поведение Корректное поведение
LWG 4083 C++23 views::as_rvalue ранее принимал диапазоны, не являющиеся входными отклоняется

См. также

ranges::iter_move
(C++20)
приводит результат разыменования объекта к соответствующему типу rvalue-ссылки
(объект-точка настройки)
move_iterator
(C++11)
адаптер итератора, разыменование которого возвращает rvalue
(шаблон класса)
move_sentinel
(C++20)
адаптер сентинела для std::move_iterator
(шаблон класса)
ranges::as_const_viewviews::as_const
(C++23)
преобразует view в constant_range
(шаблон класса) (объект-адаптер диапазона)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/as_rvalue_view

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API