Namespaces
Variants

std::ranges::dangling

ja.cppreference.net より
 
 
Rangeライブラリ
Rangeアダプタ
 
ヘッダ <ranges>
struct dangling;
で定義されます。(C++20以上)

dangling はプレースホルダ型であり空のクラス型です。テンプレートエイリアス ranges::borrowed_iterator_t および ranges::borrowed_subrange_t と共に使用されます。

一部の 制約付きアルゴリズム は通常、イテレータまたはサブレンジの 範囲 が特定の右辺値 range 引数で、これは をモデル化しない borrowed_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 型を取得する
(エイリアステンプレート)
型が range であり、その式から取得したイテレータがダングリングの危険なく安全に返却できることを指定する
(コンセプト)