问题描述
我正在阅读有关完美转发的信息,这使我感到困惑:
当您尝试实现完美转发时,您将执行以下操作:
I'm reading about perfect forwarding, and this is something I've learnt that has confused me:
When you're trying to achieve perfect forwarding, you'll do something like this:
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)
所以我想,等等,这是否意味着如果我这样做了
So then I thought, wait, does that mean that if I did this:
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);
But that's not what happens. foo instead looks like this: void foo(int x);
我的问题:完美的转发功能如何将T变成T&或T&& amp;但在另一种情况下,T不是参考吗?有人可以告诉我确切的规则吗?我需要澄清一下!
推荐答案
如果模板参数 T
出现在函数参数中,则只能将其推断为引用类型 形式为 T&&
A template parameter T
can be deduced as a reference type only if it appears in a function parameter of the form T&&
具有以下形式的功能模板:
A function template of the form:
-
template< class T>void f(T x)
- 将推导出
T
作为对象类型(而x
是对象类型,因此按值传递)
template<class T> void f(T x)
- will deduce
T
as an object type (andx
is an object type so is passed by value)
template< class T>void f(T& x)
T
作为对象类型(然后 x
具有左值引用类型)template<class T> void f(T& x)
T
as an object type (and then x
has lvalue reference type)
template< class T>void f(T& x)
T
为- 两个一个左值引用(由于引用折叠规则,因此
x
具有左值引用类型) - 或作为对象类型(因此
x
具有右值引用类型)
- either an lvalue reference (so
x
has lvalue reference type due to reference collapsing rules) - or as an object type (so
x
has rvalue reference type)
这是错误的. T
成为引用类型 L&
或对象类型 R
,不是参考 R&&
.
形式为 T&&
的功能参数因此变为
This is wrong. T
becomes a reference type L&
or an object type R
, not a reference R&&
.
The function parameter of the form T&&
thus becomes
-
L&
(因为将左值引用添加到左值引用仍然是左值引用,就像add_rvalue_reference< L& :: type
仍L&
) - 或变成
R&
(因为add_rvalue_reference< R> :: type
是R&&
))
- either
L&
(because adding an rvalue reference to an lvalue reference is still an lvalue reference, just likeadd_rvalue_reference<L&>::type
is stillL&
) - or it becomes
R&&
(becauseadd_rvalue_reference<R>::type
isR&&
)
这篇关于当您进行完美转发时,类型名称T变为T& amp;.或T& amp; amp; amp; amp; amp; amp; amp; amp;但当您不这样做时,T根本不是参考.如何?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!