Spec-Zone.ru › C++

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)
1) dangling тривиально конструируется по умолчанию.
2) 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'

См. также

ranges::borrowed_iterator_tranges::borrowed_subrange_t
(C++20)
получает тип итератора или subrange тип borrowed_range
(псевдоним шаблона)
ranges::borrowed_range
(C++20)
указывает, что тип является range, а итераторы, полученные из выражения этого типа, можно безопасно возвращать, не опасаясь, что они станут висячими
(концепт)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/dangling

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API