std::ranges::dangling
Определено в заголовке <ranges> | ||
|---|---|---|
struct dangling; | (с C++20) |
dangling — это тип-заполнитель и пустой тип класса, используемый совместно с шаблонами-псевдонимами ranges::borrowed_iterator_t и ranges::borrowed_subrange_t.
Когда некоторые ограниченные алгоритмы, обычно возвращающие итератор или поддиапазон range, принимают конкретный аргумент rvalue range, который не моделирует borrowed_range, вместо этого будет возвращено dangling, чтобы избежать возврата потенциально висящих результатов.
Члены-функции
std::ranges::dangling::dangling
constexpr dangling() noexcept = default; | (1) | |
template<class... Args>
constexpr dangling(Args&&...) noexcept { }
| (2) |
dangling тривиально допускает конструктор по умолчанию.dangling может быть создан из аргументов произвольного числа и произвольного непустого типа. Сама конструкция не имеет побочных эффектов. Другими словами, после замены типа (например, типа итератора) в корректной не-агрегатной инициализации на 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'
См. также
|
(C++20) | получает тип итератора или тип subrange для borrowed_range(шаблон-псевдоним) |
|
(C++20) | указывает, что тип является range, и итераторы, полученные из выражения от него, могут быть безопасно возвращены без риска получения висящих (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/ranges/dangling