了解普遍参考的类型扣除
Understanding type deduction for universal references
令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
被推荐为int
,par
是类型int
。
转发参考文献通过简单添加一个规则来工作:当用于type扣除转发参考的参数(即用于a dem> demanded T
的参数 T&&
)时使用类型X &
代替X
进行扣除。
请注意,这意味着给定类型X
,只有X
或X &
可以是类型扣除的结果;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 类型
type
,T&&
将扩展到type& &&
,折叠成type&
如果提供的参数为 rvalue 类型
type
,T&&
将扩展到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&
。
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 返回int数据类型v/s传递参考
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 如何检查两种类型是否相同,忽略const和参考
- CPP中的单个参考代表两种或多个数据类型
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 维护对元素参考类型
- 为什么可以将其他类型变量用作C 中常量参考参数参数的参数
- 在编写特征以进行参考和非参考类型时,如何减少重复
- Python ctypes,回调函数增强类型是C++参考
- 通过参考推断模板包中的冲突类型
- 如何使用自我参考类型并在C 类中使用别名
- 如何在基本类型参考中存储对派生类型的参考
- 试图分配输出以查看指针和参考输出时,请勿命名类型错误
- 了解普遍参考的类型扣除
- sizeof参考对于类型和数据成员的不同
- rvalue参考绑定到std ::功能类型的LVALUE
- 如果铸造运算符对类型和引用类型的引用,为什么直接列表初始化会导致类型参考铸件的模棱两可
- C 型转换到类型与 C 型转换到类型参考