为什么这个代码打印的是RValue而不是LValue



我在测试代码时遇到了这个问题。

这是我的代码:

#include <iostream>
template<typename T>
void check(T&& other) {
std::cout << "Rvalue" << std::endl;
}
template<typename T>
void check(T& other) {
std::cout << "Lvalue" << std::endl;
}
template<typename T>
void call(T other) {
check(std::forward<T>(other));
}
int main() {    
std::string t = "Cool";
call(t);
}

输出:

RValue

为什么这个";R值";?我确实传递了一个LValue,当它转发时,它不是作为LValue转发吗?为什么它调用check的RValue函数?

要正确使用std::forward,参数类型应该是T &&,而不是T。这样修复:
template<typename T>
void call(T&& other) {
check(std::forward<T>(other));
}

然后我们得到了预期的结果。

在线演示

std::forward参考

当t是转发引用(声明的函数参数作为cv不合格函数模板的右值引用参数(,此重载将参数转发给另一个函数将其传递给调用函数时所具有的值类别。

最新更新