在标准 C++(和 C ),使用参数必须明确的指出其类型。然而,随着模版类型的出现以及模板元编程的技巧,某物的类型,特别是函数定义明确的回返类型,就不容易表示。在这样的情况下,将中间结果存储于参数是件困难的事,可能会需要知道特定的元编程程序库的内部情况。
C++11 提供两种方法缓解上述所遇到的困难。首先,有被明确初始化的参数可以使用 auto 关键字。这会依据该初始化子(initializer)的具体类型产生参数:
auto someStrangeCallableType = boost::bind(&SomeFunction, _2, _1, someObject); auto otherVariable = 5;
someStrangeCallableType 的类型就是模板函数 boost::bind
对特定引数所回返的类型。作为编译器语义分析责任的一部份,这个类型能够简单地被编译器决定,但用户要通过查看来判断类型就不是那么容易的一件事了。
otherVariable 的类型同样也是定义明确的,但用户很容易就能判别。它是个 int(整数),就和整数字面值的类型一样。
除此之外,decltype 能够被用来在编译期决定一个表示式的类型。举例:
int someInt; decltype(someInt) otherIntegerVariable = 5;
decltype 和 auto 一起使用会更为有用,因为 auto 参数的类型只有编译器知道。然而 decltype 对于那些大量运用运算符重载和特化的类型的代码的表示也非常有用。
auto
对于减少冗赘的代码也很有用。举例而言,程序员不用写像下面这样:
for (vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr)
而可以用更简短的
for (auto itr = myvec.cbegin(); itr != myvec.cend(); ++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是右值 }