Namespaces
Variants

std::ranges:: dangling

From cppreference.net
Ranges library
Range adaptors
Определено в заголовочном файле <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)
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'

Смотрите также

получает тип итератора или subrange для borrowed_range
(псевдоним шаблона)
определяет, что тип является range и итераторы, полученные из его выражения, могут быть безопасно возвращены без риска висячих ссылок
(концепт)