std::ranges::dangling
来自 cppreference.cn
                    
                                        
                    
                    
                                                            
                    | 定义于头文件  <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,并且从其表达式获得的迭代器可以安全返回而不会有悬空的危险(概念) | 


