C 11 decltype类型推导

RTTI(运行时类型识别):为每一个类型产生一个type_info类型数据,程序员可以在程序中使用typeid随时查询一个变量的类型,typeid返回的是type_info,在type_info中name()函数返回类型名字。c++11中又增加了hash_code函数返回该类型唯一的哈希值,用来对变量的类型随时进行比较。

decltype的类型推导是以一个普通的表达式为参数,返回该表达式的类型。作为一个类型指示符,其可以将获得的类型来定义另外一个变量。

auto是从变量声明的初始化表达式获得变量的类型

它们的推导在编译时进行

decltype(e)来获取类型时,编译器将遵循以下四原则:

1.如果e是一个没有带括号的标记符表达式[所有除去关键字、字面量等编译器需要使用的标记之外的程序员自定义的标记] 或者 类成员访问表达式,那么decltype(e)就是e所命名的实体类型。此外,如果e是一个被重载的函数,会导致编译时错误。

2.假设e的类型是T,如果e是将亡值,那么decltype(e)返回的类型是T&&.

3.假设e的类型是T,如果e是一个左值,则decltype(e)返回的类型是T&

4.假设e是T类型,则decltype(e)返回的类型是T

c++ 11标准库中添加的模板类is_lvalue_reference,可以用来进行一些推导结果的识别

   

与auto类型推导时不能“带走" cv限制符不同,decltype是能够“带走”表达式cv限制符的,但是如果是对象中定义有const或volatile限制符,使用decltype进行推导时,其成员不会继承const或volatile限制符。

    模板追踪返回类型:

template<typename T1, typename T2>

auto  Sum(T1& t1, T2& t2) -> decltype(t1 + t2){

        return t1 + t2;

}

复合符号->decltype(t1 + t2)被称为追踪返回类型,函数返回值的位置由auto关键字占据。  如果没有返回类型,可以将返回类型声明为void 。追踪返回类型可以应用于函数模板、普通函数、函数指针、函数引用、结构体或类的成员函数、类模板的成员函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值