decay-copy
template< class T >
typename std::decay<T>::type /*decay-copy*/( T&& value );
|
(начиная с C++11) (до C++20) (только для демонстрации*) |
|
template< class T >
requires std::convertible_to<T, std::decay_t<T>>
constexpr std::decay_t<T> /*decay-copy*/( T&& value )
noexcept(std::is_nothrow_convertible_v<T, std::decay_t<T>>);
|
(начиная с C++20) (только для демонстрации*) |
|
Возвращает std::forward<T>(value) (неявно преобразованный к распавшемуся типу), распавшееся prvalue копию value.
Параметры
| value | - | значение для копирования |
Возвращаемое значение
Распавшаяся копия value как prvalue.
Примечания
decay-copy
был введен в результате решения
LWG issue 929
. Изначально он использовался в
библиотеке поддержки параллелизма
для обеспечения decay аргументов при передаче по значению, а позже стал использоваться в
библиотеке диапазонов
.
Языковая возможность
auto
(
x
)
представленная в C++23 также позволяет создавать decayed-копии как prvalue. Единственное различие заключается в том, что
decay-copy
всегда
материализует
value
и создает копию, тогда как
auto
(
expr
)
является no-op операцией, если
expr
является prvalue.
Все использования
decay-copy
в стандартной библиотеке (см. ниже), за исключением
views::all
,
ranges::take_view
и
ranges::drop_view
, заменены на
auto
(
x
)
начиная с C++23.
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3724 | C++20 |
decay-copy
was not constrained
|
constrained |
Смотрите также
создает новый объект
thread
(публичная функция-член
std::thread
)
|
|
создает новый объект
jthread
(публичная функция-член
std::jthread
)
|
|
|
(C++11)
|
запускает функцию асинхронно (потенциально в новом потоке) и возвращает
std::future
, который будет содержать результат
(шаблон функции) |
|
(C++20)
|
возвращает итератор на начало диапазона
(объект точки настройки) |
|
(C++20)
|
возвращает страж, указывающий на конец диапазона
(объект точки настройки) |
|
(C++20)
|
возвращает обратный итератор на диапазон
(объект точки настройки) |
|
(C++20)
|
возвращает обратный конечный итератор на диапазон
(объект точки настройки) |
|
(C++20)
|
возвращает целое число, равное размеру диапазона
(объект точки настройки) |
|
(C++20)
|
получает указатель на начало непрерывного диапазона
(объект точки настройки) |
|
(C++20)
|
view
, который включает все элементы
range
(псевдоним шаблона) (объект адаптера диапазона) |
|
(C++20)
|
view
, состоящий из первых N элементов другого
view
(шаблон класса) (объект адаптера диапазона) |
|
(C++20)
|
view
, состоящий из элементов другого
view
, пропуская первые N элементов
(шаблон класса) (объект адаптера диапазона) |