模板实参推断与引用
2016-10-16 14:52
190 查看
1从左值引用函数参数推断类型
template<typename T>void f1(T&);当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给他一个左值(如:一个变量或一个返回引用类型的表达式)。实参可以是const类型,也可以不是。如果实参是const,者T被推断为const类型。
template<typename T>void f2(const T&);如果一个函数参数的类型是const T&;正常的规则告诉我们可以传递给他任何类型的实参-------一个对象(const或非const),一个临时对象或是一个字面值常量。单函数参数本身是const,T的类型推断结构不会是一个const类型。const已经是函数参数类型的一部分;因此,他不会也是模板参数类型的一部分。
2从右值引用函数参数推断类型
template<typename T>void f3(T&& );当一个函数参数是一个右值引用时,正常的绑定规则告诉我们可以传递给它一个右值。当我们这样做时,类型推断过程类似左值引用函数参数的推断过程。推断出的T的类型是该右值实参的类型;
3引用折叠和右值应用参数
a 我们能将一个左值传递给函数的右值引用参数,且此右值引用指向模板类型参数时,编译器推断模板类型参数为实参的左值引用类型。
b 如果我们简介创建一个引用的引用,则这些引用形成折叠:X& & , X& && , X && &都折叠成类型X&;X&& &&折叠成X&&
如果将引用折叠规则和右值引用的特殊类型推断规则组合在一起,则意味着我们可以对一个左值调用f3,编译器推断T为左值引用
template<typename T>void f1(T&);当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给他一个左值(如:一个变量或一个返回引用类型的表达式)。实参可以是const类型,也可以不是。如果实参是const,者T被推断为const类型。
template<typename T>void f2(const T&);如果一个函数参数的类型是const T&;正常的规则告诉我们可以传递给他任何类型的实参-------一个对象(const或非const),一个临时对象或是一个字面值常量。单函数参数本身是const,T的类型推断结构不会是一个const类型。const已经是函数参数类型的一部分;因此,他不会也是模板参数类型的一部分。
2从右值引用函数参数推断类型
template<typename T>void f3(T&& );当一个函数参数是一个右值引用时,正常的绑定规则告诉我们可以传递给它一个右值。当我们这样做时,类型推断过程类似左值引用函数参数的推断过程。推断出的T的类型是该右值实参的类型;
3引用折叠和右值应用参数
a 我们能将一个左值传递给函数的右值引用参数,且此右值引用指向模板类型参数时,编译器推断模板类型参数为实参的左值引用类型。
b 如果我们简介创建一个引用的引用,则这些引用形成折叠:X& & , X& && , X && &都折叠成类型X&;X&& &&折叠成X&&
如果将引用折叠规则和右值引用的特殊类型推断规则组合在一起,则意味着我们可以对一个左值调用f3,编译器推断T为左值引用
相关文章推荐
- C++:模板实参推断及引用折叠
- 模板实参推断
- 模板实参推断与函数指针
- C++模板实参推断
- 模板实参推断
- 模板实参推断
- 模板与泛型编程之模板实参推断
- 模板实参推断
- 模板实参推断
- C++primer学习:模板编成(5):模板实参推断{1}
- STL运用的C++技术(3)——模板实参推断
- 模板实参推断与函数指针
- STL运用的C++技术(3)——模板实参推断
- C++语法基础--模板实参推断,模板类型形参的实参的受限转换,模板实参推断与函数指针
- C++primer阅读笔记-模板与泛型编程(模板实参推断)
- STL运用的C++技术(3)——模板实参推断 .
- 模板实参推断与函数指针的一些事
- 模板实参推断
- STL运用的C++技术(3)——模板实参推断
- 模版实参的推断和引用