我在试图理解 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;
}
程序的输出是
calling fn with rvalue: [lvalue][rvalue]
现在我的问题是我们如何首先获得 lvalue
?这是我的思路
在我们的 main
中,我调用了 fn(0);
现在 0 是右值。于是通用引用x推导如下
void fn (int&& && x);
现在根据引用折叠我们会得到
void fn (int&& x);
因此使 x
表现得像一个右值。因此,如果 x
被传递,则应该调用右值重载方法。但是,似乎调用了另一个重载的左值引用函数。如果有人能澄清这一点,我将不胜感激
最佳答案
命名 变量永远不是右值。它总是一个左值。右值只是没有名称的纯表达式。
int && i = int(0);
这里表达式 int(0)
是一个右值,但是变量 i
本身是一个左值,声明为绑定(bind)到一个右值。
关于c++ - 理解这个完美的转发示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23600843/