std::ranges::dangling

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围适配器
 
在标头 <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'; // 编译错误:没有匹配的 '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 的迭代器类型或子范围类型
(别名模板)
指定类型为 range 而且能安全返回从该类型表达式获得的迭代器而无悬垂之虞
(概念)