摘自:深入应用C++11:代码优化与工程级应用
1.1.1 auto类型推导
auto的特性:
auto并不能代表一个实际的类型声明,只是一个类型声明的“占位符”。
使用auto声明的变量必须马上初始化,以让编译器推断出它的实际类型,并在编译时将auto占位符替换为真正的类型。
auto的推导规则:
当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符类型一致。
当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性。(取决于其指向的类型)。
【cv限定符】是const和volatile限定符的统称。
auto的限制:
auto不能用于函数参数(GCC上可以作为函数参数)。
auto不能用于非静态成员变量,可以用于带const属性的静态成员变量。ISO C++禁止在类内初始化non-const static成员。
不能定义auto类型的数组,除非使用列表初始化该数组。
auto不能推导出模板的参数。
auto的实际应用:
类型声明过于冗长时简化代码。
1.1.2 decltype关键字
获取表达式的类型:
decltype通过表达式得到类型,可以保留住表达式的引用及const限定符。
decltype的推导规则:
exp是标识符、类访问表达式,decltype(exp)和exp的类型一致。
exp是函数调用,decltype(exp)的返回值的类型一致。
若exp是一个左值,则decltype(exp)是exp类型的左值引用,否则和exp类型一致。
【左值、右值】
在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。
在C++11中可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。
【左值引用】
左值引用就是对一个左值进行引用的类型。
decltype的实际应用:
decltype多用于泛型编程中。如:
vector<int> vectorNum;decltype(vectorNum.begin()) it=vectorNum.begin();
decltype用于抽取变量表达式的类型。
decltype可以用于定义类型。如:
typedef decltype(nullptr) nullptr_t;
1.1.3 返回类型后置语法–auto和decltype的结合使用
返回值类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。
例如:
template <typename T, typename U>
auto add(T t,U u) -> decltype (t+u)
{
return t+u;
}