decay-copy

来自cppreference.com


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),它是 value 退化后的纯右值副本。

参数

value - 要复制的值

返回值

value 退化后的副本,它是纯右值。

注解

decay-copyLWG 问题 929 的解决方案引入。它首先用于并发支持库以确保实参在按值传递时会退化,后续用于范围库

C++23 中引入的语言特性 auto(x) 同样允许创建作为纯右值的退化后副本。两者唯一的区别是 decay-copy 始终会实质化 value 并产生副本,而 auto(expr)expr 为纯右值时是空操作。

从 C++23 开始,标准库中除 views::allranges::take_viewranges::drop_view 以外所有用到 decay-copy 的地方(见下文)都替换成了 auto(x)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3724 C++20 decay-copy 没有受到约束 补充约束

参阅

构造新的 thread 对象
(std::thread 的公开成员函数)
创建新的 jthread 对象
(std::jthread 的公开成员函数)
(C++11)
异步运行一个函数(有可能在新线程中执行),并返回将保有它的结果的 std::future
(函数模板)
返回指向范围起始的迭代器
(定制点对象)
返回指示范围结尾的哨位
(定制点对象)
返回指向范围的逆向迭代器
(定制点对象)
返回指向范围的逆向尾迭代器
(定制点对象)
返回等于范围大小的整数
(定制点对象)
获得指向连续范围的起始的指针
(定制点对象)
包含 range 的所有元素的 view
(别名模板) (范围适配器对象)
由另一 view 的前 N 个元素组成的 view
(类模板) (范围适配器对象)
由另一 view 跳过前 N 个元素组成的 view
(类模板) (范围适配器对象)