C 11 decltype类型推导

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

C 11 decltype类型推导

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 decltype类型推导

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

   

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

C 11 decltype类型推导

    模板追踪返回类型:

template<typename T1, typename T2>

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

        return t1 + t2;

}

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