码迷,mamicode.com
首页 > 编程语言 > 详细

C++模板实参推断

时间:2015-07-09 00:57:35      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:模板推断   cc++   

1 类型转换与模板实参

1)自动转换的只有:const转换, 数组及函数到指针的转换

注:不同大小相同元素类型是不同的类型

2)相同模板参数名对应的实参类型必须相同

3)不同模板参数名对应的实参类型可以不同,但必须兼容


2 函数模板的返回值问题

函数模板只会对函数参数列表的类型进行推断不会对返回值推断

解决方法:

1) 显示模板参数

注: 显示指定了模板类型参数在类型转换上和普通函数参数一样

template <typename T1, typename T2, typename T3>

T1 alternative_sum(T2, T3)

------------------------------------------------------------------------------

auto v = alternative_sum<int>(i, j);

v为int

2) 尾置返回类型

template <typename It>

auto fcn(It first, It larst) -> decltype(*first)

{

return *first;

}

注:对迭代器的decltype运算符返回的只能是对象的引用,不能是值.

可以借助remove_reference<decltype(*first)>::type

3 函数指针与实参推断

程序上下文必须满足:对每个模板参数能唯一确定起类型或值


4 引用与模板实参推断

1) 左值引用

T& ---> 实参必须是一个左值

f1(i)   i(int)                T int

f1(ci)  ci (const int)   T const int

f1(5) 错误,不是左值

const T& ---> 实参可以是对象(const或非const), 临时对象, 或字面值常量

注:当函数实参是const时, T将不是const类型

f2(i)   i(int)                T int

f2(ci)  ci (const int)   T  int

f2(5) 错误,不是左值   T int

注: const参数可以绑定到一个右值


2) 右值引用


T&& 

------出入实参               T

       左值 左值引用

       右值 对象类型

       左值引用 左值引用

       右值引用 右值引用

引用折叠只能用于间接创建的引用的引用.

右指引用的常用用途:1) 模板转发, 模板重载


5 std::move原理

template <typename T>

typename remove_reference<T>::type&& move(T&& t){

             reurn static_cast<typename remove_reference<T>::type&&>(t);

}

注:将一个左值static_cast转到一个右值引用是允许的.

6 转发std::forward

forward<T> 返回类型是T&&








版权声明:本文为博主原创文章,未经博主允许不得转载。

C++模板实参推断

标签:模板推断   cc++   

原文地址:http://blog.csdn.net/tangchenchan/article/details/46809075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!