std::ranges::view_interface<D>::data
ja.cppreference.net より
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!
関連項目
|
(C++17)
|
基となる配列へのポインタを取得する
(関数テンプレート) |
|
(C++20)
|
連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
ポインタライクな型から生ポインタを取得する
(関数テンプレート) |