我在尝试了解std::forward
做什么
// forward example
#include <utility> // std::forward
#include <iostream> // std::cout
// function with lvalue and rvalue reference overloads:
void overloaded (const int& x) {std::cout << "[lvalue]";}
void overloaded (int&& x) {std::cout << "[rvalue]";}
// function template taking rvalue reference to deduced type:
template <class T> void fn (T&& x) {
overloaded (x); // always an lvalue
overloaded (std::forward<T>(x)); // rvalue if argument is rvalue
}
int main () {
std::cout << "calling fn with rvalue: ";
fn (0);
std::cout << '\n';
return 0;
}
程序的输出是
用rvalue调用fn:[lvalue] [rvalue]
现在我的问题是我们是如何首先获得lvalue
的?这是我的思路
在我们的main
我打电话fn(0);
现在0是左值。因此,通用参考x推导到以下
void fn (int&& && x);
现在根据参考折叠,我们会得到
void fn (int&& x);
因此使x
的行为与rvalue相同。如果传递x
,则应调用rvalue重载方法。但是,似乎调用了另一个重载的左值引用函数。如果有人能澄清这个,我将不胜感激
答案 0 :(得分:3)
名为的变量绝对不是右值。它总是一个左值。 Rvalues只是纯表达式,没有名称。
int && i = int(0);
此处表达式int(0)
是一个右值,但变量i
本身是一个左值,声明绑定到右值。