c – 当你完美前进时,typename T变为T&或T \u0026\u0026,但是当你不完美时,T根本就不是引用.怎么样?

我正在阅读关于完美转发的内容,这是我所学到的让我困惑的事情:当你试图实现完美的转发时,你会做这样的事情:

template<class T> // If I were to call foo with an l-value int, foo would look
void foo(T &&x);  // like this: void foo(int& &&x)

那么我想,等等,这是否意味着如果我这样做:

template<class T> // If I were to call foo with an l-value int, foo would look
void foo(T x);    // like this: void foo(int& x);

但事实并非如此. foo看起来像这样:void foo(int x);

我的问题:为什么完美的转发功能,T变成T&或T&&,但在另一个,T不是参考?有人可以告诉我这个的确切规则吗?我需要一些澄清!

最佳答案
只有当模板参数T出现在形式T&&amp ;;的形式的函数参数中时,它才能被推导为参考类型.

表单的函数模板:

> template< class T> void f(T x)将T推导为对象类型(并且x是对象类型,因此通过值传递)
> template< class T> void f(T& x)将推导T作为对象类型(然后x具有左值引用类型)
> template< class T> void f(T&& x)将推导出T as

>左值参考(因此x由于参考折叠规则而具有左值参考类型)
>或作为对象类型(因此x具有右值引用类型)

How come in the perfect forwarding function, T turns into a T& or T&&, […]

这是错的. T成为参考类型L&或对象类型R,而不是参考R&&amp ;.
形式T&&amp ;;的形式的功能参数.因此成为

> L& (因为为左值引用添加右值引用仍然是左值引用,就像add_rvalue_reference< L&> :: type仍然是L&)
>或者它成为R&& (因为add_rvalue_reference< R> :: type是R&&)

转载注明原文:c – 当你完美前进时,typename T变为T&或T \u0026\u0026,但是当你不完美时,T根本就不是引用.怎么样? - 代码日志