std::ranges::dangling
From cppreference.com
| ヘッダ <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'; // compilation error: no match for 'operator*' // (operand type is '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 models 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であり、その式のインスタンスから取得したイテレータがダングリングの危険なく安全に返されることを規定する(コンセプト) |