You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 17:27:03