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 。追踪返回类型可以应用于函数模板、普通函数、函数指针、函数引用、结构体或类的成员函数、类模板的成员函数。