Namespaces
Variants

std::ranges:: dangling

From cppreference.net
Ranges library
Range adaptors
定义于头文件 <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());
        // 正确: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 且从其表达式获取的迭代器可安全返回而不会产生悬垂风险
(概念)