首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于rvalue引用

关于rvalue引用
EN

Stack Overflow用户
提问于 2022-08-16 17:52:35
回答 1查看 73关注 0票数 -1

我有一个有趣的例子来理解lvalue引用、rvalue引用和std::forward。也许这将是一个有用的例子,一个深为低估的概念。

代码语言:javascript
复制
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);
}

产出如下:

代码语言:javascript
复制
wrapperTemplate
foo&&
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-16 18:29:42

您不能调用lvalue引用版本,因为t是一个doublefoo()需要一个int。并且不能将从double强制转换到int的临时生成的值绑定到lvalue引用。临时值是rvalue,因此可以用来调用rvalue重载。

a是一个rvalue引用这一事实并没有改变结果:

代码语言:javascript
复制
double a=5;
double& t=a;
wrapper(t);

仍有指纹:

代码语言:javascript
复制
wrapperTemplate
foo&&

https://godbolt.org/z/89T7Wzc8e

如果类型匹配,则调用lvalue引用函数:

代码语言:javascript
复制
int a=5;
int& t=a;
wrapper(t);

指纹:

代码语言:javascript
复制
wrapperTemplate
foo&

https://godbolt.org/z/chnzaKhGf

如果使用std::move(),则返回到rvalue引用版本:

代码语言:javascript
复制
int a=5;
int& t=a;
wrapper(std::move(t));

指纹:

代码语言:javascript
复制
wrapperTemplate
foo&&

https://godbolt.org/z/68KPYrhYP

删除wrapper也不会改变行为:

代码语言:javascript
复制
double a=5;
foo(a);
int b=5;
foo(b);
foo(std::move(b));

指纹:

代码语言:javascript
复制
foo&&
foo&
foo&&

https://godbolt.org/z/fds6sKvhW

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73378251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档