|
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'
}
Вывод:
Смотрите также
|
|
получает тип итератора или
subrange
для
borrowed_range
(псевдоним шаблона)
|
|
|
определяет, что тип является
range
и итераторы, полученные из его выражения, могут быть безопасно возвращены без риска висячих ссылок
(концепт)
|