理解这个完美的转发例子
Understading this perfect forwarding example
我在试图理解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
表现得像右值。因此,如果传递了x
,则应该调用右值重载方法。然而,似乎调用了另一个重载左值引用函数。如果有人能澄清一下,我将不胜感激
命名的变量绝不是右值。它总是一个左值。右值只是没有名称的纯表达式。
int && i = int(0);
这里的表达式int(0)
是一个右值,但是变量i
本身是一个左值,声明绑定到一个右值
相关文章:
- 将函数参数完美转发到函数指针:按值传递呢?
- C++20理念:要求表达和完美转发
- 完美的转发和构造函数
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 返回值的完美转发?
- 使用衰减与完美转发
- 可变参数模板:将整数参数完美转发到 lambda
- 完美转发C++重载和模板化函子及其参数
- 在完美转发中需要衰减
- C++完美转发:如何避免悬空引用
- 完美的对象转发阵列
- 无法理解一段具有完美转发和省略号的C++代码
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- 完美转发可变参数模板模板
- 在完美转发函数中公开参数类型,避免代码重复
- 完美的转发构造函数和已删除的构造函数
- 完美的转发功能推断出冲突错误
- 使用完美转发的模板转换构造函数
- 完美转发使用结构化绑定声明的变量
- 完美转发常量参数以进行持续评估