|
Range primitives | |||||||
|
Range concepts | |||||||||||||||||||
|
Range factories | |||||||||
|
Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Helper items | |||||||||||||||||
|
Defined in header <ranges> | ||
struct dangling; | (since C++20) | |
dangling
is a placeholder type and an empty class type, used together with the template aliasesranges::borrowed_iterator_t andranges::borrowed_subrange_t.
When someconstrained algorithms that usually return an iterator or a subrange of arange
take a particular rvaluerange
argument that does not modelborrowed_range
,dangling
will be returned instead to avoid returning potentially dangling results.
Contents |
constexpr dangling()noexcept=default; | (1) | |
template<class...Args> constexpr dangling(Args&&...)noexcept{} | (2) | |
dangling
is trivially default constructible.dangling
can be constructed from arguments of arbitrary number and arbitrary non-void type. The construction does not have any side-effect itself.In other words, after replacing the type (e.g. an iterator type) in a well-formed non-aggregate initialization withdangling
, the resulting initialization is also well-formed.
#include <algorithm>#include <array>#include <iostream>#include <ranges>#include <type_traits>#include <string_view> int main(){auto get_array_by_value=[]{returnstd::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=[]()->conststd::array<int,4>&{staticconstexprstd::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=[]{returnstd::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'}
Output:
1 'a'
obtains iterator type orsubrange type of aborrowed_range (alias template)[edit] | |
(C++20) | specifies that a type is arange and iterators obtained from an expression of it can be safely returned without danger of dangling(concept)[edit] |