std::ranges::dangling
来自cppreference.com
在标头 <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()); // 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 的迭代器类型或子范围类型 (别名模板) | |
(C++20) |
指定类型为 range 而且能安全返回从该类型表达式获得的迭代器而无悬垂之虞 (概念) |