名稱空間
變體
操作

std::ranges::dangling

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
struct dangling;
(C++20 起)

dangling 是一個佔位符型別和一個空類型別,與模板別名 ranges::borrowed_iterator_tranges::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 型別
(別名模板)[編輯]
指定型別為 range,並且從其表示式獲得的迭代器可以安全返回而不會有懸空的危險
(概念) [編輯]