decay-copy
来自cppreference.com
< cpp | standard library
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>> |
(C++20 起) | |
返回(隐式转换到退化后类型的)std::forward<T>(value),它是 value 退化后的纯右值副本。
参数
value | - | 要复制的值 |
返回值
value 退化后的副本,它是纯右值。
注解
decay-copy
由 LWG 问题 929 的解决方案引入。它首先用于并发支持库以确保实参在按值传递时会退化,后续用于范围库。
C++23 中引入的语言特性 auto(x) 同样允许创建作为纯右值的退化后副本 。两者唯一的区别是 decay-copy
始终会实质化 value 并产生副本,而 auto(expr) 在 expr 是纯右值时不会进行任何操作。
从 C++23 开始,标准库中除 views::all、ranges::take_view 和 ranges::drop_view 以外所有用到 decay-copy
的地方(见下文)都替换成了 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) |
包含 range 的所有元素的 view (别名模板) (范围适配器对象) |
(C++20) |
由另一 view 的前 N 个元素组成的 view (类模板) (范围适配器对象) |
(C++20) |
由另一 view 跳过首 N 个元素组成的 view (类模板) (范围适配器对象) |