C++如何单表达式复制对象并将副本转为右值引用传参
解决方案
完全可以实现你需要的工具函数,该操作在C++标准中是完全支持的。
通用工具函数实现
你需要的make_copy_and_move_said_copy可以用以下通用模板实现,支持所有可拷贝类型:
#include <type_traits> template <typename T> std::decay_t<T> copy_as_rvalue(T&& val) { return std::forward<T>(val); }
使用示例
对应你给出的测试代码,直接调用即可:
int main() { int n = get_value(); // 直接传副本右值,原变量n不受任何影响 foo(copy_as_rvalue(n)); other_function(n); // 原变量值完全保留,可正常使用 }
原理说明
- 该函数返回的是值类型的临时对象,属于C++中的纯右值,天然可以绑定到右值引用参数
- 当传入左值时,函数内部会自动调用参数的拷贝构造函数生成独立副本,不会修改原变量的状态
- 模板中
std::decay_t的作用是去掉参数的引用、CV限定符,获取到实际的值类型,保证返回的是独立副本
无需自定义函数的简写方案
如果你不想额外定义工具函数,也可以直接显式构造临时对象传参,效果完全一致:
// 写法1:指定类型构造临时对象 foo(int(n)); // 写法2:通用类型推导,不需要手动写类型 foo(std::decay_t<decltype(n)>(n));
临时对象本身就是右值,不需要额外调用std::move即可直接传给接收右值引用的接口。
内容的提问来源于stack exchange,提问作者Mary Chang
相关产品推荐
相关产品推荐

