decay-copy

Returns std::forward(value) (implicitly converted to the decayed type), a decayed prvalue copy of value.

# Declarations

template< class T >
typename std::decay<T>::type decay-copy( T&& value );

(since C++11) (until C++20) (exposition only*)

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>>);

(since C++20) (exposition only*)

# Parameters

# Return value

A decayed copy of value as a prvalue.

# Notes

decay-copy was introduced by the resolution of LWG issue 929. It is initially used in the concurrency support library to ensure that arguments are decayed when passing-by-value, and is later used in the ranges library.

The language feature auto(x) introduced in C++23 also allows decayed copies to be created as prvalues. The only difference is that decay-copy always materializes value and produces a copy, while auto(expr) is a no-op if expr is a prvalue.

All usages of decay-copy in the standard library (see below) except views::all, ranges::take_view and ranges::drop_view are replaced with auto(x) since C++23.

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 3724C++20decay-copy was not constrainedconstrained

# See also