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'; // 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 ,並且從其表示式獲得的迭代器可以安全返回而不會有懸空的危險(概念) |