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

什么场景下会绑定到接收右值引用参数的forward函数重载?

C++ forward右值引用重载的作用与触发场景

第一个接收右值引用参数的forward重载不能直接删除,它在传入无主右值作为实参的场景下会被触发。

为什么测试案例只触发第二个重载

你测试时所有传给forward的实参都是emplace函数的形参arg:所有有名称的变量,无论本身类型是左值引用还是右值引用,变量自身都是左值,左值会优先匹配非const左值引用的形参,所以测试案例只会触发第二个forward(T& arg)重载。

第一个重载的触发场景

当你直接给forward传入无名称的右值(包括字面量等纯右值、std::move返回的亡值、返回右值引用的函数返回值等),并显式指定forward的模板参数时,就会触发第一个重载。示例代码如下:

// 触发第一个重载的三个典型场景
forward<int>(123); // 传入字面量纯右值

int a = 0;
forward<int>(std::move(a)); // 传入std::move返回的亡值

int&& get_rvalue() { return std::move(a); }
forward<int>(get_rvalue()); // 传入返回右值引用的函数返回值

如果删除第一个重载,上述代码都会编译失败:非const左值引用T&无法绑定到右值实参。

标准库设计两个forward重载的核心目的是覆盖所有转发场景,既可以转发有名称的左值/右值引用形参,也可以直接转发无主右值,避免出现转发漏洞。

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:18:02