我有一个有趣的例子来理解lvalue引用、rvalue引用和std::forward。也许这将是一个有用的例子,一个深为低估的概念。
void foo(int&& a){
cout<<"foo&&"<<endl;
}
void foo(int& a){
cout<<"foo&"<<endl;
}
template <typename T>
void wrapper(T&& a){
cout<<"wrapperTemplate"<<endl;
foo(forward<T>(a));
};
int main()
{
double&& a=5;
double& t=a;
wrapper(t);
}产出如下:
wrapperTemplate
foo&&发布于 2022-08-16 18:29:42
您不能调用lvalue引用版本,因为t是一个double,foo()需要一个int。并且不能将从double强制转换到int的临时生成的值绑定到lvalue引用。临时值是rvalue,因此可以用来调用rvalue重载。
a是一个rvalue引用这一事实并没有改变结果:
double a=5;
double& t=a;
wrapper(t);仍有指纹:
wrapperTemplate
foo&&https://godbolt.org/z/89T7Wzc8e
如果类型匹配,则调用lvalue引用函数:
int a=5;
int& t=a;
wrapper(t);指纹:
wrapperTemplate
foo&https://godbolt.org/z/chnzaKhGf
如果使用std::move(),则返回到rvalue引用版本:
int a=5;
int& t=a;
wrapper(std::move(t));指纹:
wrapperTemplate
foo&&https://godbolt.org/z/68KPYrhYP
删除wrapper也不会改变行为:
double a=5;
foo(a);
int b=5;
foo(b);
foo(std::move(b));指纹:
foo&&
foo&
foo&&https://stackoverflow.com/questions/73378251
复制相似问题