C++ auto关键字

简介: C++ auto关键字

C++11 中有:auto 类型推导

auto x = 5; // OK: x 是 int 类型
auto pi = new auto(1); // OK: pi 被推导为 int*
const auto *v = &x, u = 6; // OK: v是const int*类型,u是const int类型
static auto y = 0.0; //OK: y是double类型
auto int r; //error: auto不再表示存储类型指示符
auto s; //error: auto无法推导出s的类型

一、auto的推导规则

从示例中可以看到auto的一些使用方法。它可以同指针、引用结合起来使用,还可以带上cv限定符(cv-qualifier,const和volatile限定符的统称)

auto * a = &x;  // a -> int*,auto被推导为int
auto   b = &x;  // b -> int*,auto被推导为int*
auto & c = x;   // c -> int&,auto被推导为int
auto   d = c;   // d -> int ,auto被推导为int
const auto e = x; // e -> const int
auto f = e;  // f -> int
const auto& g = x; // e -> const int&
auto& h = g;// f -> const int&
  • a和c的推导结果是很显然的,auto在编译时被替换为int,因此a和c分别被推导为int*和int&
  • b的推导结果说明,其实auto不声明为指针,也可以推导出指针类型
  • d的推导结果说明当表达式是一个引用类型时,auto会把引用类型抛弃,直接推导成原始类型int
  • e的推导结果说明,const auto会在编译时被替换为const int
  • f的推导结果说明,当表达式带有cons(t实际上volatile也会得到同样的结果)属性时,auto会把const属性抛弃掉,推导成non-const类型int
  • g、h的推导说明,当auto和引用(换成指针在这里也将得到同样的结果)结合时,auto的推导将保留表达式的const属性

通过上面的一系列示例,可以得到下面这两条规则:

1)当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后类型一致

2)当声明为指针或引用时,auto的推导结果将保持初始化表达式的cv属性

二、auto的限制

  1. auto是不能用于函数参数
  2. auto不能用于非静态成员变量
  3. auto无法定义数组
  4. auto无法推导出模板参数

推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家:

零声白金学习卡(含基础架构/高性能存储/golang云原生/音视频/Linux内核)

https://xxetb.xet.tech/s/VsFMs


相关文章
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
安全 程序员 编译器
C++ 11新特性之auto和decltype
C++ 11新特性之auto和decltype
38 3
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
3月前
|
存储 安全 编译器
C++入门 | auto关键字、范围for、指针空值nullptr
C++入门 | auto关键字、范围for、指针空值nullptr
65 4
|
3月前
|
存储 编译器 C++
【C++关键字】auto的使用(C++11)
【C++关键字】auto的使用(C++11)
|
4月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
存储 安全 编译器
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
【C++航海王:追寻罗杰的编程之路】引用、内联、auto关键字、基于范围的for、指针空值nullptr
66 5
|
4月前
|
存储 编译器 C++
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
C++从遗忘到入门问题之float、double 和 long double 之间的主要区别是什么
|
4月前
|
编译器 C++
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
C++从遗忘到入门问题之C++中的浮点数类型问题如何解决
|
4月前
|
编译器 C++ 容器
在 C++ 中 auto什么意思
在 C++ 中 auto什么意思