Spec-Zone.ru › C++

std::ranges::view_interface<D>::data

constexpr auto data()
    requires std::contiguous_iterator<ranges::iterator_t<D>>;
(1) (since C++20)
constexpr auto data() const
    requires ranges::range<const D> && 
        std::contiguous_iterator<ranges::iterator_t<const D>>;
(2) (since 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/w/cpp/ranges/view_interface/data

Spec-Zone.ru

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