自动推导之auto关键字

auto关键字
auto关键字可以实现类型推导,但auto关键字不是一个实际的类型声明,仅仅是一个类型声明的占位符,由编译器在编译时推导变量类型,属于隐式类型声明


auto关键字的使用:
1、用auto声明变量时必须同时初始化 
如: 
	auto i; 	//错误

2、用auto在一条语句中声明多个变量时,该语句中所有变量的初始基本数据类型必须一致
如: 
	auto ss = 0, pi = 3.14;	//错误

3、用auto声明变量时,不能自动推导出顶层的CV-qualifiers(const 与 volatile)和引用类型,除非显示声明。
如:
	const int ci = 0,; 
	auto b = ci;					//b -> int (ci的顶层const属性被忽略)
	const auto c = ci;				//c -> const int (显示声明const)
	int &r = ci; 
	auto d = r;						//d -> int (引用真正参与初始化的是引用对象的值,忽略引用类型)

4、用auto声明变量时,会保留底层const
如:
	auto e = &ci;					//e -> const int * (对整数常量取地址为底层const)

5、auto 与 & 同时使用时,不能忽略顶层const
如:
	auto &f = ci;					//f -> const int&	(如果f为非const引用将会可以修改ci的值,这显然是不合理的)

6、不能在函数参数与模板上使用auto关键字
如 :
	void func(auto a)...		Bar<int> bar;	Bar<auto> g = bar;			//错误 

7、只有static const auto h = 0;这种初始化类成员变量的方式不会出现错误,因为这种成员变量可以就地初始化


8、初始化表达式为数组名时,将推导为指针类型
如:
	int arr[10] = { 0 }; 
	auto i = arr;						//i -> int *	(数组名本来就是首元素首地址,即指针)

9、若表达式为数组且auto带上&,则推导类型为数组类型。
如 :
	auto &j = arr;						//j -> int[10]

10、由于auto仅仅是一个占位符,而不是一个真正的类型,因此不能使用一些以类型为操作数的操作符,如sizeof或者typeid。
如:
	cout << sizeof(auto) << endl;				//错误
	cout << typeid(auto).name() << endl;		//错误


应用


1.用于容器遍历时声明迭代器类型; 
2.用于在模板中接收一个模板函数的返回值用于后续处理。




注:auto很强大,但是滥用也可能导致代码的可读性和可维护性大大降低,在使用时一定要权衡利弊


参考
C++11特性:auto关键字 http://www.cnblogs.com/QG-whz/p/4951177.html
C++ Primer
深入应用C++ 11
<think>好的,我现在需要帮助用户了解C++中auto关键字的使用方法和示例。首先,我需要回忆一下auto关键字的基本概念。根据引用[4],auto在C++11中作为类型占位符,能自动推导变量类型,必须初始化变量。这点很重要,因为用户可能会忘记初始化导致错误。 接下来,用户可能想知道具体的使用场景。根据引用中的例子,比如与lambda表达式和范围for循环结合使用,如引用[1]中的例子。还有在函数返回类型推导中的应用,比如引用[2]中的GetName()函数返回类型推导为std::string。这些例子需要详细说明,让用户明白如何在不同情况下使用auto。 然后,需要注意auto的限制。例如,引用[3]提到在结构体中直接使用auto声明成员变量是错误的,因为C++不允许这样做。这时候需要提醒用户,避免他们犯同样的错误。同时,引用[4]提到的指针和引用情况下的const和volatile保留规则也很重要,需要分情况讨论,确保用户理解不同情况下的推导结果。 用户还可能关心使用auto的好处,比如代码简洁和减少类型错误。这部分需要结合示例,比如迭代器类型自动推导,避免冗长的类型声明,提升代码可读性。同时,要指出过度使用的坏处,比如降低可读性,特别是在复杂表达式时。 此外,用户可能想知道如何正确结合其他C++11特性,如decltype和尾置返回类型。这部分需要简单说明,并提供示例,如函数模板中的返回类型推导,帮助用户扩展应用场景。 最后,整理出结构清晰的回答,分点列出基本用法、常见场景、注意事项,并附上示例代码。确保每个部分都有对应的引用支持,并在末尾添加相关问题,引导用户深入学习。同时,检查LaTeX格式是否符合要求,数学表达式是否正确使用$...$,独立公式用$$...$$,避免格式错误。</think>### C++ `auto`关键字的使用方法与示例 `auto`是C++11引入的关键字,用于**自动推导变量类型**,简化代码并提升可读性[^4]。以下是其核心用法和注意事项: --- #### 一、基本用法 1. **变量声明必须初始化** `auto`声明的变量需通过初始化表达式推导类型,例如: ```cpp auto x = 10; // x的类型推导为int auto str = "hello"; // str的类型推导为const char* ``` [^4] 2. **与复杂类型结合使用** 简化容器迭代器、模板等场景的代码: ```cpp std::vector<int> vec = {1, 2, 3}; auto it = vec.begin(); // it的类型推导为std::vector<int>::iterator ``` [^1] --- #### 二、常见使用场景 1. **范围`for`循环** 遍历容器时自动推导元素类型: ```cpp std::vector<std::string> names = {"Alice", "Bob"}; for (auto& name : names) { // 推导为std::string& std::cout << name << std::endl; } ``` 2. **Lambda表达式** 结合`auto`声明Lambda函数对象: ```cpp auto add = [](int a, int b) { return a + b; }; int result = add(3, 5); // result = 8 ``` 3. **函数返回类型推导(C++14+)** 自动推导函数返回类型: ```cpp auto GetName() { return std::string("Charlie"); // 返回类型推导为std::string } ``` [^2] --- #### 三、注意事项 1. **类型推导规则** - **非指针/引用类型**:忽略顶层`const`和`volatile`: ```cpp const int a = 10; auto b = a; // b的类型为int(忽略const) ``` - **指针/引用类型**:保留底层`const`和`volatile`: ```cpp const int* p = &a; auto q = p; // q的类型为const int* ``` 2. **限制** - **不能用于非静态成员变量**: ```cpp struct Example { auto value = 42; // 错误!结构体成员不能用auto声明[^3] }; ``` - **需避免过度使用**:复杂表达式可能降低可读性。 --- #### 四、扩展用法 - **`decltype`结合使用**:用于需要明确类型推导的场景: ```cpp auto x = 5; decltype(x) y = x + 1; // y的类型为int ``` - **模板编程**:简化泛型代码: ```cpp template <typename T, typename U> auto add(T a, U b) -> decltype(a + b) { return a + b; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值