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>> |
(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
(类模板) (范围适配器对象) |