std::ranges:: dangling
From cppreference.net
C++
Ranges library
|
||||||||||||||||||||||
| Range primitives | |||||||
|
|||||||
| Range concepts | |||||||||||||||||||
|
|||||||||||||||||||
| Range factories | |||||||||
|
|||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||
| Helper items | |||||||||||||||||
|
|
||||||||||||||||
|
定义于头文件
<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
类型
(别名模板) |
|
|
(C++20)
|
指定类型为
range
且从其表达式获取的迭代器可安全返回而不会产生悬垂风险
(概念) |