std::ranges::view_interface<D>::data
constexpr auto data()
requires std::contiguous_iterator<ranges::iterator_t<D>>;
| (1) | (с C++20) |
constexpr auto data() const
requires ranges::range<const D> &&
std::contiguous_iterator<ranges::iterator_t<const D>>;
| (2) | (с C++20) |
Реализация по умолчанию функции-члена data() получает адрес, обозначаемый итератором начала, с помощью std::to_address, который также является наименьшим адресом непрерывного хранилища (что следует из contiguous_iterator), на которое ссылается представление производного типа, если представление не пусто.
derived — это static_cast<D&>(*this). Эквивалентно return std::to_address(ranges::begin(derived));.derived — это static_cast<const D&>(*this).Возвращаемое значение
Адрес, обозначаемый итератором начала.
Примечания
Следующие производные типы могут использовать реализацию по умолчанию data():
std::ranges::common_viewstd::ranges::drop_viewstd::ranges::drop_while_viewstd::ranges::ref_viewstd::ranges::subrangestd::ranges::take_viewstd::ranges::take_while_view
Следующие типы являются производными от std::ranges::view_interface и не объявляют собственную функцию-член data(), но не могут использовать реализацию по умолчанию, поскольку их типы итераторов никогда не удовлетворяют требованиям contiguous_iterator:
std::ranges::basic_istream_viewstd::ranges::elements_viewstd::ranges::filter_viewstd::ranges::iota_viewstd::ranges::join_viewstd::ranges::lazy_split_viewstd::ranges::reverse_viewstd::ranges::split_viewstd::ranges::transform_view
Пример
#include <array>
#include <iostream>
#include <ranges>
#include <string_view>
int main() {
constexpr std::string_view str { "Hello, C++20!" };
std::cout << (str | std::views::drop(7)).data() << '\n';
constexpr static std::array a { 1,2,3,4,5 };
constexpr auto v { a | std::views::take(3) };
static_assert( &a[0] == v.data() );
}
Вывод:
C++20!
См. также
|
(C++17) | получает указатель на базовый массив (шаблон функции) |
|
(C++20) | получает указатель на начало непрерывного диапазона (объект-точка настройки) |
|
(C++20) | получает указатель на начало доступного только для чтения непрерывного диапазона (объект-точка настройки) |
|
(C++20) | получает обычный указатель из типа, подобного указателю (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/view_interface/data