Spec-Zone.ru › C++

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)
async
(C++11)
асинхронно запускает функцию (возможно, в новом потоке) и возвращает std::future, который будет содержать результат
(шаблон функции)
ranges::begin
(C++20)
возвращает итератор на начало диапазона
(объект точки настройки)
ranges::end
(C++20)
возвращает сентинел, обозначающий конец диапазона
(объект точки настройки)
ranges::rbegin
(C++20)
возвращает обратный итератор для диапазона
(объект точки настройки)
ranges::rend
(C++20)
возвращает обратный итератор конца диапазона
(объект точки настройки)
ranges::size
(C++20)
возвращает целое число, равное размеру диапазона
(объект точки настройки)
ranges::data
(C++20)
получает указатель на начало непрерывного диапазона
(объект точки настройки)
views::all_tviews::all
(C++20)
view, включающий все элементы range
(шаблон псевдонима) (объект-адаптер диапазона)
ranges::take_viewviews::take
(C++20)
view, состоящий из первых N элементов другого view
(шаблон класса) (объект-адаптер диапазона)
ranges::drop_viewviews::drop
(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

Spec-Zone.ru

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