有下面这个情况:

template <class T1, class T2>
void ft (T1 &x, T2 &y)
{...?type? xpy = x+;...
}

在这种情况下xpy应该是什么类型呢?由于不知道ft()将如何使用,因此无法预知这一点。正确的类型可能是T1、T2或者其他类型。假如又出现了重载运算符,这会让问题更加的复杂。

于是为了解决这个问题,c++11新增了关键字 decltype。

我们可以这样使用:

int x;
decltype(x) y;//y的类型和x类型一致

除了上述这样写,我们也可以这样写:

decltype(x+y) xpy;
xpy = x+y;

通过这个关键字,我们可以把前面的代码修改成这样:

template <class T1, class T2>
void ft(T1 x, T2 y)
{...decltype(x+y) xpy = x+y;...
}

decltype比这些实例要复杂些。为了确定类型,编译器必须遍历一个核对表。假设有如下声明:

decltype (expression) var;

1.如果expression是一个没有用括号括起的标识符,则var的类型与该标识符类型相同,包括const等限定符

double x = 5.5;
double y = 7.9
double &rx = x;
const double *pd;
decltype(x) w; // w is type double
decltype (rx) u = y; // u is type double &
decltype(pd) v; // v is type const double *

2.如果expression是一个函数调用,则var的类型与函数的返回类型相同:

long indeed(int)
decltype (indeed(3)) m; // is type int

这里并不会实际调用函数。编译器通过查看函数的原型来获悉返回类型,而无需实际调用函数。

3.加入expression是用括号括起来的标识符:

double xx = 4.4;
decltype((xx)) r2 = xx ; // r2 is double &
decltype(xx) w = xx; // w is double

括号并不会改变表达式的值和左值性。

4.如果前面都不满足,则var的类型与expression类型相同:

int j = 3;
int &k  = j;
int  &n = j;
decltype (j+6)i1; // i1 type int
decltype (100L) i2; // i2 type long
decltype (k+n) i3; // i3 type int

虽然k和n都是引用,是表达式k+n不是引用。

如果需要多次声明,可以结合使用typdef和decltype:

template <class T1, class T2>
void ft(T1 x, T2 y)
{typedef decltype (x+y) xytype;xytype xpy = x+y;xytype arr[10];xytype &rxy = arr[2]; // rxy a reference
}

还有一个问题是decltype没有办法解决的:

template <class T1, class T2>
?type? gt(T1 x, T2 y)
{return x+y;
}

同样无法预知x和y相加得到的类型。看起来我们还可以用decltype,但是很不幸,这个时候还没有声明x和y,它们不在作用域内。必须在声明参数后使用decltype。为此,c++新增了一种声明和定义函数的语法。

double h(intx, float y);

可以用新增的语法编写成这个样子:

auto h(int x, float y) -> double;

这将返回类型移到了参数声明后面。->double被称为后置返回类型(trailing return type)。 其中auto是一个占位符,表示后置返回类型提供的类型。这是c++11的新增auto语法。这个语法也可以用于函数定义。

auto h (int x, float y) -> double
{/* function body*/};

通过结合使用这种语法和decltype,便可以给gt()指定返回类型。

template <class T1, class T2>
auto gt(T1x, T2 y)  ->decltype(x+y)
{return x+y;
}

现在,decltype在参数声明后面,因此x和y位于作用域内,可以使用它们。

C++11 decltype相关推荐

  1. C++11 decltype类型推导详解

    decltype decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type" ...

  2. C++11 decltype表达式

    decltype 在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以使用 C++11 提供的 decltype 关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型,语法 ...

  3. [C++11]decltype在泛型编程中的使用举例

    关于decltype的应用多出现在泛型编程中,比如我们编写一个类模板,在里面添加遍历容器的函数,操作如下: 代码如下: #include <iostream> #include <l ...

  4. C++11 decltype 的用法粗解

    1.decltype 是啥子 感性认识跟 auto 一样 auto a = 1; 但 decltype 是这样用 decltype(表达式) a = 值;// 例如 decltype(1) a = 2 ...

  5. C++语法学习笔记二十九: 详解decltype含义,decltype主要用途

    实例代码 // 详解decltype含义,decltype主要用途#include <iostream> #include <functional> #include < ...

  6. 全网精华之C++11 60篇链接汇总

    整理得比较完整的一个C++11系列教程,遵循由浅到深的编排顺序,并且做了大量上机验证和堪误,以及语病和语义通顺修改,呕心沥血,增删改查1年多时间才完成,汇聚csdn.博客园.Google搜索.百度搜索 ...

  7. CppPrimer 学习笔记(1)

    目录 第一章 开始 熟悉编译器 IO 注释 while语句 for语句 使用文件重定向 第二章 变量和基本类型 基本内置类型 如何选择类型 类型转换 字面值常量 变量 变量定义(define) 变量的 ...

  8. 阿龙的学习笔记---C++ 进阶知识(博客汇总)

    1. C++11 - 右值引用和Move语义 讲解了C++中的左值和右值,从C开始将起,主要是自定义类型的问题.https://www.cnblogs.com/catch/p/3500678.html ...

  9. 使用Clang作为编译器 —— Clang 语言扩展

    1. 介绍 本文档描述了 Clang 提供的语言扩展.除了这里列出的语言扩展之外,Clang 还旨在支持广泛的 GCC 扩展.有关这些扩展的更多信息,请参阅 GCC手册. 2. 特性检查宏 语言扩展可 ...

  10. C++11 类型推导decltype

    我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应type_info数据,通 ...

最新文章

  1. r语言echarts画箱线图_echarts学习笔记之箱线图的分析与绘制详解
  2. OpenCV(十六)边缘检测2 -- Laplace(拉普拉斯)二阶微分算子
  3. 企业可视化报表工具选型经验分享
  4. Linux基础之shell变量
  5. Cetos 7 系统安装备注事项
  6. ORACLE EBS中OAF屏蔽的错误
  7. 第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器
  8. 微信支付软件架构重构之旅
  9. World Wind Java开发之十一——加载热点信息(仿Google Earth)(转)
  10. linux环境下python 库模块安装
  11. Hadoop上传文件到HDFS失败
  12. python实现对解析之后的DOM进行层次化处理升序输出
  13. mysql安装教程 2018_sql server 2018下载
  14. 抛负载”ISO 7637-2测试标准讲解,车规级TVS管优选建议
  15. android应用程序开发宝典,android应用程序开发宝典.pdf
  16. typedef 定义结构体说明
  17. 最新SOCKS5代理服务器 socks5代理ip地址
  18. 【自动化营销】跨境电商高效进行WhatsApp营销技巧!
  19. js中浏览器失焦获焦的几种结局方法
  20. canvas学习日记一

热门文章

  1. 利用Linux系统实现VLAN间的单臂路由及安全网关的功能
  2. pythopn tuple(元组)
  3. 梭子鱼下一代防火墙在对比研究中名列榜首
  4. B22-SVN在iOS开发的使用中遇到的问题
  5. 强大命令——Ping命令总结
  6. jms两种模式例子-超越昨天的自己系列(2)
  7. 1.剑指Offer --- 面试的流程
  8. 15.企业应用架构模式 --- 分布模式
  9. 应用安全 - 代码审计 - Python
  10. SpringBoot中自定义错误页面