了解普遍参考的类型扣除

Understanding type deduction for universal references

本文关键字:类型 参考 了解      更新时间:2023-10-16

foo为函数:

template< typename T >
void foo( T&& a ){}

针对foo的以下调用推导哪种类型T

foo( 0 ); // is T here int or int&& ?
int a = 0;
foo( a ); // is T here int or int& ?

类型扣除的默认规则是,参考类型永远不可能是扣除的结果。给定此代码,

template <class T>
void bar(T par);
bar(0);
int a;
bar(a);
int &b;
bar(b);

所有3个呼叫都将拨打foo<int>。也就是说,T被推荐为intpar是类型int

转发参考文献通过简单添加一个规则来工作:当用于type扣除转发参考的参数(即用于a dem> demanded T的参数 T&&)时使用类型X &代替X进行扣除。

请注意,这意味着给定类型X,只有XX &可以是类型扣除的结果;X &&永远不会。

让我们分析您的代码(我将重命名他的功能参数,以清楚我所指的内容):

template <class T>
void foo(T &&par);
foo(0);
int a;
foo(a);

在第一种情况foo(0)中,该参数是类型int的RVALUE,因此int类型用于类型扣除,这意味着T被推导为int(称为foo<int>的函数为CC_23),并且par的类型是int &&。/p>

在第二种情况foo(a)中,该参数是int类型的 lvalue 。转发参考规则启动,int &类型用于扣除。因此,T被推荐为int &(称为foo<int&>的函数),par的类型为" int & &&",它折叠至int &

推论的上下文中的表达式 T&& 喜欢您提供的内容

template< typename T >
void foo( T&& a ){}

ie t是根据提供的论点推导的参考折叠规则。

简称

  • 如果提供的参数为 lvalue 类型typeT&&将扩展到type& &&,折叠成type&

  • 如果提供的参数为 rvalue 类型typeT&&将扩展到type &&,折叠成type&&

请注意,如果您需要触发rvalue,则两者都是参考另一个功能的超载,您需要执行std::forward<T>(a)

foo(0);//在这里t in int或int&amp;&amp;?

int

int a = 0; foo(a);//在这里t in int或int&amp;?

a int&