decay-copy

From cppreference.com
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*)

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

Parameters

value - the value to be copied

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

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 3724 C++20 decay-copy was not constrained constrained

See also

constructs new thread object
(public member function of std::thread)
constructs new jthread object
(public member function of std::jthread)
(C++11)
runs a function asynchronously (potentially in a new thread) and returns a std::future that will hold the result
(function template)
returns an iterator to the beginning of a range
(customization point object)
returns a sentinel indicating the end of a range
(customization point object)
returns a reverse iterator to a range
(customization point object)
returns a reverse end iterator to a range
(customization point object)
returns an integer equal to the size of a range
(customization point object)
obtains a pointer to the beginning of a contiguous range
(customization point object)
a view that includes all elements of a range
(alias template) (range adaptor object)
a view consisting of the first N elements of another view
(class template) (range adaptor object)
a view consisting of elements of another view, skipping the first N elements
(class template) (range adaptor object)