江西高端网站定制网络seo哈尔滨
1.C++11关键字
auto和decltype是C++11引入的关键字,负责类型的推导。所有不同的是:
auto可直接用来定义变量,编译器会自动推导出变量的类型。decltype是推导出一个操作数的类型,然后用这个类型再去定义。
2.两者区别
尽管两者都是宏观意义上的类型推导,但是还是有细微差别的。关键字auto在类型推导过程中会发生一些退化,比如在:
- 顶层const会被忽略
- 引用(左值右值都一样)
- 数组 -> 首地址
- 函数 -> 函数指针
void func() {}
int main()
{const int a = 10;auto auto_a = a;// 顶层const可以忽略,推导后为intint &&b = 10;auto auto_b = b;// 引用可以忽略,推导后为intint arr[3] = { 1,2,3 };auto auto_arr = arr;// 退化为首地址,推导为int*auto auto_func = func;// 推导为函数指针void (*func)()
}
而对于上述场景, decltype会保留原始类型,不会退化。
3.使用场景
1.auto关键字经常用在两个地方(我自己理解常用的)
- 在类似lambda表达式或者接收复杂函数的复杂返回值的时候,直接用auto去承接返回值。
auto res = [](int x) {return x * 2; };
- 在STL中迭代器、模板类型,直接用auto去简化。
std::map<int, std::string> myMap;
for (auto it = myMap.begin(); it!= myMap.end(); ++it) {// ...
}
2.decltype关键字相当于是更严谨的auto,它可以保证推导出来的类型不退化,特别是当需要保留const和引用场景的时候。
举一个模板编程的例子:
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {return t + u;
}
4.为什么对于函数类型推导要加上:-> decltype()
总结一句话:更加灵活、准确地推导出类型。
auto 函数名() -> decltype()
已经形成一种固定搭配了!