C++左值右值完美转发转移
左值(Lvalue)与右值(Rvalue)英文含义:
[*]左值(Lvalue):Locator value,意味着它指向一个详细的内存位置。
[*]右值(Rvalue):Read value,指的是可以读取的数据,但不一定指向一个固定的内存位置。
定义
[*]左值:指的是一个持久的内存地址。左值可以出现在赋值操作的左侧或右侧。比方,变量、数组的元素、对对象成员的引用等都是左值。
[*]右值:通常是临时的、不能有多个引用的值,它们不指向持久的内存地址。右值可以出现在赋值操作的右侧,但不能出现在左侧。字面量(如42、3.14)、临时对象、以及返回临时对象的表达式等都是右值。
完美转发(Perfect Forwarding)
完美转发是C++11引入的一个概念,其目的是允许函数模板将参数以原来的左值或右值的形式转发到其他函数。这是通过引用折叠规则和std::forward函数实现的。完美转发的一个关键应用场景是模板函数中,我们盼望将接收到的参数以完全相同的形式(保持其左值或右值性质)通报给另一个函数时使用。
引用折叠规则
在模板函数或类中,当一个引用的引用被形成时,它们会折叠成单一的引用
[*]T& & ,T& &&, T&& & 都会被折叠为 T&
[*]T&& && 会被折叠为T&&
示例
[*]当wrapper(lv)被调用时,lv是一个左值,因此模板参数T被推断为int&(左值引用)。由于引用折叠规则,T&&折叠为int&。因此,std::forward(arg)将arg作为左值引用转发给process函数,调用process(int& i)版本。
[*]当wrapper(20)被调用时,20是一个右值,因此模板参数T被推断为int。由于T是一个非引用类型,T&&就直接是int&&(右值引用)。因此,std::forward(arg)将arg作为右值引用转发给process函数,调用process(int&& i)版本。
#include #include// std::forward// 分别处理左值和右值void process(int& i) { std::cout
页:
[1]