C++11 auto详解(网络整理)

/* 
 * 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;  //可以定义指针
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搓搓程序狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值