【C++11】auto && decltype && nullptr
Ⅰ. auto
在 C++98
中 auto
是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto
就没什么价值了。
所以 C++11
中废弃 auto
原来的用法,将其用于实现自动类型推导。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型。
int main()
{
int i = 10;
auto p = &i;
auto pf = strcpy;
cout << typeid(p).name() << endl;
cout << typeid(pf).name() << endl;
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
//map<string, string>::iterator it = dict.begin();
auto it = dict.begin();
return 0;
}
易错点:
代码语言:javascript代码运行次数:0运行复制#include<iostream>
#include<vector>
// 4. vs2013不支持函数形参是auto变量,而qt可以
void func(auto a)
{
//.....
}
// 5. auto变量不能作为自定义类型的成员变量
struct test
{
int a;
auto b=10;
};
int main()
{
// 1. 定义变量时,必须初始化
auto a; // ❌
a = 10;
// 2. 不能是auto数组
auto b[3] = {1, 2, 3}; // ❌
// 3. 模板实例化类型不能是auto类型
std::vector<int> a;
std::vector<auto> b = { 1 }; // ❌
return 0;
}
Ⅱ. decltype
auto
使用的前提是:必须要对 auto
声明的类型进行初始化,否则编译器无法推导出 auto
的实际类型。但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间,代码不会运行,此时 auto
也就无能为力。