什么场景下会绑定到接收右值引用参数的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
相关产品推荐
相关产品推荐

