c++ auto关键字使用

C++11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:

    int a = 10;
    auto au_a = a;//自动类型推断,au_a为int类型
    cout << typeid(au_a).name() << endl;

typeid运算符可以输出变量的类型。程序的运行结果输出了

int

auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。例如上面的代码,编译的时候,就会把a变量转换为int类型。

auto和其他变量类型有明显的区别:

1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型。

2.auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数

 

auto的用法

上面举的这个例子很简单,在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。下面列举auto关键字的正确用法。

用于代替冗长复杂、变量使用范围专一的变量声明。

想象一下在没有auto的时候,我们操作标准库时经常需要这样:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vs;
    for (std::vector<std::string>::iterator i = vs.begin(); i != vs.end(); i++)
    {
        //...
    }
}

 

这样看代码写代码实在烦得很。有人可能会说为何不直接使用using namespace std,这样代码可以短一点。实际上这不是该建议的方法(C++Primer对此有相关叙述)。使用auto能简化代码:

#include<string>
#include<vector>
int main()
{
    std::vector<std::string> vs;
    for (auto i = vs.begin(); i != vs.end(); i++)
    {
        //..
    }
}

for循环中的i将在编译时自动推导其类型,而不用我们显式去定义那长长的一串。

 

decltype

decltype关键字和auto相互对应的,它们经常在一些场所配合使用。decltype可以在编译的时候判断出一个变量或者表达式的类型,例如:

#include <iostream>
#include <vector>
#include <map>
using namespace std;

void func(auto can) {
    int a;
}

int main() {
    auto num = 1;  //num 是int类型
    decltype(num) num2 = num; //num2 也是int类型

    return 0;
}

这里decltype拿到了num的类型,然后用这个类型定义了num2做了num的一份copy。

 

注意事项

  • auto 变量必须在定义时初始化,这类似于const关键字。
  • 定义在一个auto序列的变量必须始终推导成同一类型。例如

auto a4 = 10, a5 = 20, a6 = 30;//正确
auto b4 = 10, b5 = 20.0, b6 = 'a';//错误,没有推导为同一类型

使用auto关键字做类型自动推导时,依次施加一下规则:

  • 如果初始化表达式是引用,则去除引用语义。

int a = 10;
int &b = a;

auto c = b;//c的类型为int而非int&(去除引用)
auto &d = b;//此时c的类型才为int&

c = 100;//a =10;
d = 100;//a =100;
  • 如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。

const int a1 = 10;
auto  b1= a1; //b1的类型为int而非const int(去除const)
const auto c1 = a1;//此时c1的类型为const int
b1 = 100;//合法
c1 = 100;//非法
  • 如果auto关键字带上&号,则不去除const语意。

const int a2 = 10;
auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int
b2 = 10; //非法

这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。

  • 初始化表达式为数组时,auto关键字推导类型为指针。
int a3[3] = { 1, 2, 3 };
auto b3 = a3;
cout << typeid(b3).name() << endl;

程序将输出

int *

 

  • 若表达式为数组且auto带上&,则推导类型为数组类型。

int a7[3] = { 1, 2, 3 };
auto & b7 = a7;
cout << typeid(b7).name() << endl;

程序输出

int [3]
  • 函数或者模板参数不能被声明为auto

void func(auto a)  //错误
{
//... 
}

​​​​​​​

  • 时刻要注意auto并不是一个真正的类型。
    auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。

cout << sizeof(auto) << endl;//错误
cout << typeid(auto).name() << endl;//错误

​​​​​​​

 

 

 

&lt;think&gt;好的,用户想了解C++auto关键字的用法和示例。首先,我需要回忆auto关键字C++中的发展历史。C++11引入了auto作为类型推导的关键字,允许编译器根据初始化表达式自动推断变量类型。之前的C++标准中,auto用于声明自动存储期的变量,但实际很少使用,因为局部变量默认就是自动存储期。因此,现在的auto用法主要集中在类型推导上。 接下来,需要明确auto的主要用途。根据经验,auto常用于简化复杂类型的声明,比如迭代器、lambda表达式、模板编程中的类型等。此外,用户可能想知道auto使用场景和注意事项,比如不能用于函数参数、不能推导数组类型等。同时,需要给出具体的代码示例,帮助用户理解如何在实际中使用auto。 然后,检查用户提供的引用内容。引用1提到C++11标准,引用2和3涉及extern关键字和指针的const用法,与auto无直接关联。因此,主要参考引用1中关于C++11的信息,说明autoC++11引入的新特性。 考虑到用户可能需要知道在不同版本中的支持情况,比如C++11及之后的版本。另外,需要提醒用户在使用auto时的最佳实践,比如在类型明显或复杂类型时使用,避免过度使用导致代码可读性下降。 最后,生成相关问题,覆盖用户可能进一步想了解的内容,如类型推导原理、与decltype的区别、在模板中的应用、性能影响等。这些问题应该能帮助用户深入理解auto关键字的不同方面。&lt;/think&gt;### C++auto关键字的用法解析 C++11引入的`auto`关键字实现了**自动类型推导**,允许编译器根据初始化表达式推断变量类型。这种机制显著简化了代码书写,尤其在处理复杂类型时效果明显[^1]。 #### 核心用法 1. **基础类型推导** ```cpp auto x = 42; // int auto y = 3.14; // double auto str = &quot;hello&quot;; // const char* ``` 2. **容器迭代器简化** ```cpp std::vector&lt;std::string&gt; names{&quot;Alice&quot;, &quot;Bob&quot;}; for(auto it = names.begin(); it != names.end(); ++it) { // it自动推导为std::vector&lt;std::string&gt;::iterator } ``` 3. **lambda表达式存储** ```cpp auto func = [](int a, int b) { return a + b; }; // 推导lambda类型 ``` 4. **模板编程辅助** ```cpp template&lt;typename T, typename U&gt; auto add(T a, U b) -&gt; decltype(a + b) { return a + b; } ``` #### 使用限制 - 不能单独使用(必须初始化):`auto x; // 错误` - 不能推导数组类型:`auto arr = {1,2,3}; // std::initializer_list&lt;int&gt;` - 函数参数中不可用(C++20前) #### 最佳实践场景 1. 迭代器类型冗长时 2. lambda表达式存储时 3. 模板元编程中类型复杂时 4. 提升泛型代码可维护性时 ```cpp // 现代C++典型应用 auto process_data(const auto&amp; container) { // C++20起支持 for(const auto&amp; elem : container) { // 自动类型遍历 // 处理元素... } } ```
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值