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) |
view, элементы которого являются rvalue.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 (открытая функция-член) |
|
возвращает базовое представление V (открытая функция-член) |
|
возвращает итератор начала as_rvalue_view (открытая функция-член) |
|
возвращает итератор конца as_rvalue_view (открытая функция-член) |
|
| возвращает размер представления, если оно ограничено (открытая функция-член) |
|
|
(C++26) | возвращает приблизительный размер базового approximately_sized_range (открытая функция-член) |
Унаследовано от |
|
возвращает, является ли производное представление пустым; доступна только в том случае, если оно удовлетворяет требованиям sized_range или forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает сентинел для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
возвращает, не является ли производное представление пустым; доступна только в том случае, если к нему применим ranges::empty (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает первый элемент производного представления, если оно удовлетворяет требованиям forward_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает последний элемент производного представления; доступна только в том случае, если оно удовлетворяет требованиям bidirectional_range и common_range (открытая функция-член std::ranges::view_interface<D>) |
|
возвращает элемент производного представления с индексом 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) |
base_ значением по умолчанию с помощью его инициализатора-члена по умолчанию (= V()).Параметры
| 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) |
Возвращает базовое представление.
return base_ ;.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 ранее принимал диапазоны, не являющиеся входными | отклоняется |
См. также
|
(C++20) | приводит результат разыменования объекта к соответствующему типу rvalue-ссылки (объект-точка настройки) |
|
(C++11) | адаптер итератора, разыменование которого возвращает rvalue (шаблон класса) |
|
(C++20) | адаптер сентинела для std::move_iterator (шаблон класса) |
|
(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