在C++中使用auto、decltype来完成自动类型推导
auto
auto 关键字让编译器自动推导类型,auto关键字相当于”占位符“的作用,编译器会自动填上去正确的数据类型。
auto i = 0; // 自动推导为int类型
auto x = 1.0; // 自动推导为double类型
auto str = "hello"; // 自动推导为const char [6]类型
std::map<int, std::string> m = {{1,"a"}, {2,"b"}}; // 自动推导不出来
auto iter = m.begin(); // 自动推导为map内部的迭代器类型
auto f = bind1st(std::less<int>(), 2); // 自动推导出类型,具体是啥不知道
在使用auto关键字时需要注意:
- auto关键字必须是通过表达式才能推导出类型。
- “自动类型推导”有时候可能失效,给不出你想要的结果。比如,在上面的这段代码里,就把字符串的类型推导成了“const char [6]”而不是“std::string”
- auto 总是推导出“值类型”,绝不会是“引用”;
- auto 可以附加上 const、volatile、*、& 这样的类型修饰符,得到新的类型
auto x = 10L; // auto推导为long,x是long
auto& x1 = x; // auto推导为long,x1是long&
auto* x2 = &x; // auto推导为long,x2是long*
const auto& x3 = x; // auto推导为long,x3是const long&
auto x4 = &x3; // auto推导为const long*,x4是const long*
decltype
decltype相对于auto,decltype的推导更为精准,decltype不仅可以推导表达式的类型,也可以推导变量的类型,同时decltype可以推导出引用类型
int x = 0; // 整型变量
int& x7 = x;
decltype(x) x1; // 推导为int,x1是int
decltype(x)& x2 = x; // 推导为int,x2是int&,引用必须赋值
decltype(x)* x3; // 推导为int,x3是int*
decltype(&x) x4; // 推导为int*,x4是int*
decltype(&x)* x5; // 推导为int*,x5是int**
decltype(x2) x6 = x2; // 推导为int&,x6是int&,引用必须赋值
但是使用decltype使用起来也有略微麻烦的地方,特别在用于初始化的时候,表达式要重复两次(左边的类型计算,右边的初始化)
在C++14中,新增加decltype(auto),既可以精准的推导类型,又可以像auto一样简单。
decltype(auto) x3 = (x); //x3为 int&类型,因为(expr)是引用类型