C++自动类型推导

LIZHAO Modern Cpp
阅读量 0 评论量 0

在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)是引用类型
喵~