Spec-Zone.ru › C++

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), на которое ссылается представление производного типа, если представление не пусто.

1) Пусть derived — это static_cast<D&>(*this). Эквивалентно return std::to_address(ranges::begin(derived));.
2) То же, что и (1), за исключением того, что derived — это static_cast<const D&>(*this).

Возвращаемое значение

Адрес, обозначаемый итератором начала.

Примечания

Следующие производные типы могут использовать реализацию по умолчанию data():

  • std::ranges::common_view
  • std::ranges::drop_view
  • std::ranges::drop_while_view
  • std::ranges::ref_view
  • std::ranges::subrange
  • std::ranges::take_view
  • std::ranges::take_while_view

Следующие типы являются производными от std::ranges::view_interface и не объявляют собственную функцию-член data(), но не могут использовать реализацию по умолчанию, поскольку их типы итераторов никогда не удовлетворяют требованиям contiguous_iterator:

  • std::ranges::basic_istream_view
  • std::ranges::elements_view
  • std::ranges::filter_view
  • std::ranges::iota_view
  • std::ranges::join_view
  • std::ranges::lazy_split_view
  • std::ranges::reverse_view
  • std::ranges::split_view
  • std::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!

См. также

data
(C++17)
получает указатель на базовый массив
(шаблон функции)
ranges::data
(C++20)
получает указатель на начало непрерывного диапазона
(объект-точка настройки)
ranges::cdata
(C++20)
получает указатель на начало доступного только для чтения непрерывного диапазона
(объект-точка настройки)
to_address
(C++20)
получает обычный указатель из типа, подобного указателю
(шаблон функции)

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

Spec-Zone.ru

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