类型推导与auto关键字
在标准C/C++,使用变量必须明确的指出其类型(强类型)。然而随着模板类型的出现以及模版元编程的技巧,指定类型,特别是函数定义明确的指定返回类型,就不容易表示。在这样的情况下,将中间结果存储与变量是一件困难的事情,可能会需要知道特定的元编程程序库的内部情况。
C++11提供了两种方法缓解上述所遇到的困难。首先被有明确初始化的变量可以使用auto关键字。这会依据该初始化式的具体类型产生变量。示例:
auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);
|
auto otherVariable =5;
|
someStrangeCallableType 的类型是模版函数 boost::bind对特定引数返回的类型,作为编译器语义分析的一部分,这个类型能够简单地被编译器决定,但用户要通过查看来判断类型就不是一件容易的事情。
otherVariable 的类型同样也是明确定义的,但用户很容易就能判断。它是个int(默认整数类型)。
除此之外,C++11还定义了 decltype 能够被用来在编译器决定一个表达式的类型。举例:
int someInt;
decltype(someInt) otherIntegerVariable =5;
|
decltype 和 auto 一起使用会更为有用,因为 auto 变量的类型只有编译器知道。然而 decltype 对于那些大量运用运算符重载和特化的类型的代码的表示也非常有用。
auto 对于减少冗赘的代码也很有用。举例而言,程序员不用写像下面这样:
for(vector<int>::const_iterator itr = myvec.begin(); itr != myvec.end();++itr)
|
可以使用auto简化为:
for(auto itr = myvec.begin(); itr != myvec.end();++itr)
|
这项差异随着程序员开始嵌套容器而更为显著,虽然在这种情况下 typedef 是一个减少代码的好方法。
decltype 所表示的类型可以和 auto 推导出来的不同。
#include <vector>
int main(){
const std::vector<int> v(1);
auto a = v[0];// a 为 int 类型
decltype(v[0]) b =0;// b 为 const int& 类型,即std::vector<int>::operator[](size_type)const 的返回类型
auto c =0;// c 为 int 类型
auto d = c;// d 为 int 类型
decltype(c) e;// e 为 int 类型,c 实体的类型
decltype((c)) f = e;// f 为 int& 类型,因为(c)是左值
decltype(0) g;// g为int类型,因为0是右值
return 0;
}
|