右值参数是如何匹配到正确的std::forward重载函数的?
关于std::forward重载匹配的核心解答
你的认知存在一个关键误区:当传入右值5触发T推导为int时,forward<T>(arg)调用的是接收int&的第一个重载,并不会匹配接收int&&的第二个重载,以下是完整推导逻辑:
1. 先明确两个基础规则
- 有名字的右值引用变量本身是左值:你说的
I_forward_arguments里的arg是左值完全正确,哪怕它的类型是int&&,只要是有名字的变量,就属于左值范畴。 - 非const右值引用只能绑定到右值:左值无法绑定到接收
int&&的函数参数,这是重载决议的核心判断依据。
2. 显式指定T为int时,两个forward重载的实例化结果
你给出的两个重载在T为int时,实例化后分别为:
// 重载1:接收左值引用 int&& forward(int& t) noexcept { return static_cast<int&&>(t); } // 重载2:接收右值引用 int&& forward(int&& t) noexcept { return static_cast<int&&>(t); }
3. 重载决议匹配过程
你传入forward的参数是左值arg:
- 左值可以精确匹配重载1的
int&参数,完全合法。 - 左值无法绑定到重载2的
int&&参数,重载2直接被排除。
4. 完美转发的实现逻辑
这里之所以能把传入的右值5继续以右值的形式转发,不是因为调用了第二个重载,而是因为第一个重载里的static_cast<int&&>(t)把左值参数t强制转换成了右值引用返回,刚好匹配你传入的原始参数的值类别。
只有当你直接给forward传入无名字的右值时(比如forward<int>(10)),才会触发第二个重载的匹配。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

