初探c++11之类型推断
编程语言可以分为两类,一类是强类型语言,例如C/C++,任何变量都要明确指出其变量类型,另外一类则是弱类型语言,所有变量都不需要明确是定类型,这一类主要是各种脚本语言,javascript, python, php, etc.
C++11中引入了一个新特性,可以在两种情况下不明确指定变量类型,而由编译器推断出变量类型。第一种情况是由初始化变量的类型来推断变量类型,如下,例子来自wiki
auto otherVariable = 5; auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject);
在这种情况下,变量的类型写成"auto"就可以,而编译器会推断它的类型。上例中第一种情况变量类型推断为整数,而第二种情况则按照boost::bind()这个函数的返回值来推断变量类型。
第二种情况是根据之前定义的变量的类型来推断当前定义变量的类型,如下,来自wiki
int someInt; decltype(someInt) otherIntegerVariable = 5;
在这种情况下,变量类型写成decltype(refference variable),编译器以reference variable的类型来推断当前变量的类型。
auto类型可以帮助我们在很多情况下简化代码,例如std::vector<int>::iterator itr=container.begin() 可以简化成auto itr=container.begin() (太爽了!),例如那些模板神马的。其次还可以简化思维,很多时候我们需要去查看一个函数的返回值来写变量声明,现在,直接auto就好了……
不过,这里还存留一些疑问。在wiki上有如下的一个例子,看的有些迷糊。
#include <vector> int main() { const std::vector<int> v(1); auto a = v[0];// a 為 int 型別 decltype(v[0])b; // 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是右值 }
查看了c++ FAQ的说明,依然不能明白。这里先存疑吧。不过里面有这样一句话,“当你只有需要推断某个表达式的数据类型,例如某个函数调用表达式的计算结果的数据类型,而不是某个变量的数据类型时,你才真正需要delctype。”