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) (неявно преобразованное к типу после decay-преобразования), копию value с типом после decay-преобразования и значением prvalue.
Параметры
| value | - | значение, которое нужно скопировать |
Возвращаемое значение
Копия value с типом после decay-преобразования и значением prvalue.
Примечания
decay-copy была введена в результате принятия предложения LWG 929. Изначально она используется в библиотеке поддержки параллелизма, чтобы гарантировать, что аргументы преобразуются с помощью decay-преобразования при передаче по значению; позднее она используется в библиотеке ranges.
Языковая возможность auto(x), появившаяся в C++23, также позволяет создавать копии с типом после decay-преобразования и значением prvalue. Единственное отличие состоит в том, что decay-copy всегда материализует value и создает копию, тогда как auto(expr) ничего не делает, если expr имеет значение prvalue.
Все использования decay-copy в стандартной библиотеке (см. ниже), кроме views::all, ranges::take_view и ranges::drop_view, начиная с C++23 заменены на auto(x).
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 3724 | C++20 |
decay-copy не имела ограничений | с ограничениями |
См. также
создаёт новый объект 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 элементов(шаблон класса) (объект-адаптер диапазона) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/standard_library/decay-copy