std::ranges:: dangling
From cppreference.net
C++
Ranges library
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | |||||||||||||||||||
|
|||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
ヘッダーで定義
<ranges>
|
||
|
struct
dangling
;
|
(C++20以降) | |
dangling
はプレースホルダー型および空のクラス型であり、テンプレートエイリアス
ranges::borrowed_iterator_t
および
ranges::borrowed_subrange_t
と共に使用されます。
通常はイテレータまたは
制約付きアルゴリズム
が
range
のイテレータまたはサブレンジを返す場合に、
borrowed_range
をモデル化しない特定の右辺値
range
引数を受け取ったとき、潜在的なダングリング結果を返すのを避けるために
dangling
が返されます。
目次 |
メンバー関数
std::ranges::dangling:: dangling
|
constexpr
dangling
(
)
noexcept
=
default
;
|
(1) | |
|
template
<
class
...
Args
>
constexpr dangling ( Args && ... ) noexcept { } |
(2) | |
1)
dangling
は自明にデフォルト構築可能です。
2)
dangling
は任意の数の引数と任意の非void型から構築できます。この構築自体には副作用がありません。
言い換えると、整形式の非集成体初期化において型(例えばイテレータ型)を
dangling
で置き換えた場合、結果の初期化も整形式となります。
例
このコードを実行
#include <algorithm> #include <array> #include <iostream> #include <ranges> #include <type_traits> #include <string_view> int main() { auto get_array_by_value = [] { return std::array{0, 1, 0, 1}; }; auto dangling_iter = std::ranges::max_element(get_array_by_value()); static_assert(std::is_same_v<std::ranges::dangling, decltype(dangling_iter)>); // std::cout << *dangling_iter << '\n'; // コンパイルエラー: 'operator*' の一致するオーバーロードがありません // (オペランド型は 'std::ranges::dangling') auto get_persistent_array = []() -> const std::array<int, 4>& { static constexpr std::array a{0, 1, 0, 1}; return a; }; auto valid_iter = std::ranges::max_element(get_persistent_array()); static_assert(!std::is_same_v<std::ranges::dangling, decltype(valid_iter)>); std::cout << *valid_iter << ' '; // 1 auto get_string_view = [] { return std::string_view{"alpha"}; }; auto valid_iter2 = std::ranges::min_element(get_string_view()); // OK: std::basic_string_view は borrowed_range をモデル化する static_assert(!std::is_same_v<std::ranges::dangling, decltype(valid_iter2)>); std::cout << '\'' << *valid_iter2 << '\'' << '\n'; // 'a' }
出力:
1 'a'
関連項目
borrowed_range
のイテレータ型または
subrange
型を取得する
(エイリアステンプレート) |
|
|
(C++20)
|
型が
range
であり、その式から取得したイテレータがダングリングの危険なく安全に返却できることを指定する
(コンセプト) |