/*
* C++11中,auto 可以让编译器在编译器就推导出变量的类型。
*
* auto不是一个类型的“声明”,而是一个“占位符”。
* 编译器在编译期会将auto替换为变量实际的类型。
* 使用auto定义变量时必须对其进行初始化。
* 在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
* 它自动推导变量类型是根据“=”右侧的变量类型决定的。
*
* 总结:
* auto 的使用必须马上初始化, 否则无法推导出类型
* auto 在一行定义多个变量时, 各个变量的推导不能产生二义性, 否则编译失败
* auto 不能用作函数参数
* auto 在类中不能用作非静态成员变量
* auto 不能定义数组, 可以定义指针
* auto 无法推导出模板参数
*/
int main()
{
// ①auto 在同一行定义多个变量
int a = 3,b = 4,c = 5;
double d = 3.0;
// ②auto 可以与指针、引用连用
auto a1 = a, &a2 = a, *a3 = &a;
// ③auto 必须初始化,否则无法推导类型
auto e; //error
// ④auto 在同一行同时初始化两种类型会产生 二义性
auto b1 = d, b2 = a; //error
system("pause");
return 0;
}
class A {
// ⑤auto 不能用作非静态成员变量
auto a = 1; //error
// 在类中只允许静态成员变量的声明,初始化必须在类外进行.
// 静态常量成员可以在类中声明初始化,(静态成员属于类只有一份,常量成员又只能初始化一次而且不能被赋值)
static auto b = 1; //error
static const auto c = 1;
};
// ⑥auto 不能作为函数的参数
// 参数要被编译成指令,但是开辟空间时候需要知道空间大小,auto做参数不知道多大,那么栈帧也不知道开多大。
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)//error
{}
// ⑦auto 不能直接用来声明数组
// 因为数组也涉及大小,在下面的例子中,a的类型严格来说是 int[3],所以b的大小也不确定。
void TestAuto()
{
int a[] = { 1,2,3 };
auto b[3] = a;//error
auto c = a; //可以定义指针
}
|