abr*_*ert 4 c++ templates function type-deduction forwarding-reference
让我们foo的功能:
template< typename T >
void foo( T&& a ){}
Run Code Online (Sandbox Code Playgroud)
T以下调用将推断出什么类型foo:
foo( 0 ); // is T here int or int&& ?
int a = 0;
foo( a ); // is T here int or int& ?
Run Code Online (Sandbox Code Playgroud)
类型推导的默认规则是引用类型永远不会是推论的结果.鉴于此代码,
template <class T>
void bar(T par);
bar(0);
int a;
bar(a);
int &b;
bar(b);
Run Code Online (Sandbox Code Playgroud)
所有3个电话都会打电话foo<int>.也就是说,T推断出int并且par是类型的int.
转发的引用通过简单添加一个规则的工作:当(a参数的即用于转发参考的类型扣参数T&&用于推导的 T)的类型是一个左值X,类型X &来代替X扣除.
请注意,这意味着给定类型X,只能X或X &可能是类型推导的结果; X &&永远不会.
让我们分析你的代码(我将重命名他的函数参数,以明确我所指的是什么):
template <class T>
void foo(T &&par);
foo(0);
int a;
foo(a);
Run Code Online (Sandbox Code Playgroud)
在第一种情况下foo(0),所述参数的类型的一个rvalue int的类型int因此用于类型扣,其含义T被推断为int(称为功能foo<int>)的类型和par是int &&.
在第二种情况下foo(a),参数是类型的左值int.转发参考规则启动,类型int &用于扣除.T因此被推导为int &(函数名为is foo<int&>),而类型par为" int & &&",其折叠为int &.