auto 指定符(C++11 起)

 
 
 
 

对于变量,指定其类型将从其初始化器自动推导而出。

对于函数,指定其返回类型是尾随的返回类型或将从其 return 语句推导出 (C++14 起)。

对于非类型模板形参,指定其类型将从参数推导出。 (C++17 起)

语法

 
auto variable initializer (1) (C++11 起)
 
auto function -> return type (2) (C++11 起)
 
auto function (3) (C++14 起)
 
decltype(auto) variable initializer (4) (C++14 起)
 
decltype(auto) function (5) (C++14 起)
 
auto :: (6) (概念 TS)
 
cv(可选) auto ref(可选) parameter (7) (C++14 起)
 
template < auto Parameter > (8) (C++17 起)
 
cv(可选) auto ref(可选) [ identifier-list ] initializer ; (9) (C++17 起)
 

解释

1) 在块作用域、命名空间作用域、循环初始化语句等中声明变量时,关键词 auto 可用作类型指定符。

只要初始化器的类型被确定,则编译器会用来自函数调用的模板实参推导规则所决定的类型替换关键词 auto (细节见模板实参推导)。关键词 auto 可与修饰符组合,如 const 或 & ,它们将参与类型推导。例如,给出 const auto& i = expr; , i 的类型恰是虚构模板 template<class U> void f(const U& u) 中参数 u 的类型,倘若函数调用 f(expr) 被编译。从而, auto&& 可根据初始化器被推导成左值或是右值引用,这被用于基于范围的for循环。

若 auto 被用于声明多个变量,则推导类型必须相符。例如,声明 auto i = 0, d = 0.0; 为病式,而声明 auto i = 0, *p = &i; 为良式,这里 auto 被推导成int。

2) 在使用尾随返回类型语法的函数声明中,关键词 auto 不进行自动类型检测。它只作为语法的一部分起作用。
3) 在不使用尾随返回类型语法的函数声明中,关键词 auto 指示返回类型将通过其 return 语句的运算数,用模板实参推导规则推导出。
4) 若变量的声明类型是 decltype(auto) ,则关键词 auto 被替换成其初始化器的表达式(或表达式列表),而实际类型以 decltype 规则推导。
5) 若函数返回值的声明类型为 decltype(auto) ,则关键词 auto 被替换成其返回语句的运算数,而其实际返回类型以 decltype 规则推导。
6) 拥有形式 auto:: 的嵌套名称指定符是占位符,它会被类或枚举类型遵循制约类型占位符推导规则替换。
7) lambda 表达式中的参数声明。 (C++14 起)函数参数声明。 (概念 TS)
8) 若模板形参声明为 auto ,则其类型由对应使用参数推导出。

注意

C++11 前, auto 拥有存储期指定符的语义。

不允许在一个声明中混合 auto 变量和函数,如 auto f() -> int, i = 0; 。

示例

运行此代码
#include <iostream>
#include <utility>
 
template<class T, class U>
auto add(T t, U u) { return t + u; } // 返回类型是 operator+(T, U) 的类型
 
// 在其所调用的函数返回引用的情况下
// 函数调用的完美转发必须用 decltype(auto)
template<class F, class... Args>
decltype(auto) PerfectForward(F fun, Args&&... args)
{
return fun(std::forward<Args>(args)...);
}
 
template<auto n> // C++17 auto 形参声明
auto f() -> std::pair<decltype(n), decltype(n)> // auto 不能从花括号初始化器列表推导
{
return {n, n};
}
 
int main()
{
auto a = 1 + 2; // a 的类型是 int
auto b = add(1, 1.2); // b 的类型是 double
static_assert(std::is_same_v<decltype(a), int>);
static_assert(std::is_same_v<decltype(b), double>);
 
decltype(auto) c1 = a; // c1 的类型是 int ,保有 a 的副本
decltype(auto) c2 = (a); // c2 的类型是 int& ,为 a 的别名
std::cout << "a, before modification through c2 = " << a << '\n';
++c2;
std::cout << "a, after modification through c2 = " << a << '\n';
 
auto [v, w] = f<0>(); // 结构化绑定声明
 
auto d = {1, 2}; // OK : d 的类型是 std::initializer_list<int>
auto n = {5}; // OK : n 的类型是 std::initializer_list<int>
// auto e{1, 2}; // C++17 起错误,之前为 std::initializer_list<int>
auto m{5}; // OK : C++17 起 m 的类型为 int ,之前为 initializer_list<int>
// decltype(auto) z = { 1, 2 } // 错误: {1, 2} 不是表达式
 
// auto 常用于无名类型,例如 lambda 表达式的类型
auto lambda = [](int x) { return x + 3; };
 
// auto int x; // 于 C++98 合法, C++11 起错误
// auto x; // 于 C 合法,于 C++ 错误
}

可能的输出:

a, before modification through c2 = 3
a, after modification through c2 = 4

c++ auto 属性的更多相关文章

  1. Hibernate配置文件的hbm2ddl.auto属性

    今天遇到一个有意思的问题,我目前做的一个网站采用Spring MVC + Spring + Hibernate的架构,我通过页面插入了一些数据到数据库,可是每次重启tomcat之后,数据都莫名其妙地丢 ...

  2. 在页面中有overflow-y:auto属性的div,当出现滚动条,点击返回顶部按钮,内容回这个div最顶部

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. css中元素的auto属性值是什么意思,比如margin:0 auto表示什么?

    auto 你可以理解为一种 自动/自适应 的概念 比如 现在项目需要一个宽度为960px的整体布局居中 根据用户浏览器大小不同你将需要使用margin:0 auto;来实现. 无论用户浏览器宽度为多少 ...

  4. CSS中margin:auto什么意思?margin:auto属性的用法详解

    我们都知道使用margin:auto可以让元素水平居中的.但你有没有想过使用margin:auto可以让元素水平居中的原因,要回答这个问题,我们首先需要看一下margin:auto的工作原理.auto ...

  5. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  6. 实用的CSS3属性和使用技巧

    CSS可以改进网站的设计并且开拓网站设计更多的可能性,可以令你的网页更具吸引力.对于前端开发者.网站设计师来说,掌握并熟练应用CSS是一项必不可少的技能. 下面列出了一些非常实用的CSS3属性和使用技 ...

  7. 关于extern和static关键字引出的一些关于作用域和链接属性和存储类型的问题

    在进入正题前我们必须了解一些概念: 标识符:标识符不仅仅代表着变量的名字,main()函数的main也是一个标识符,这点很重要. 存储类型:即变量的存储位置及其生存周期:静态区:分为两块 .date ...

  8. css中盒子宽高的auto

    CSS盒模型中,auto属性只适用于外margin和width,height,border和padding不适用.下面就来说说它的情况.这里所说的都是标准流盒子. 1.横向来说 (1)若设置width ...

  9. css中auto的用法

    —什么是auto? +auto是自适应的意思,auto是很多尺寸值的默认值,也就是由浏览器自动计算. +块级元素中margin.border.padding以及content宽度之和构成父元素widt ...

随机推荐

  1. test for open live writer

    this is a test article post by open live writer.

  2. deep learning RNN

    specialize  vi. 专攻;特化;专门从事;详细说明 vt.使专门化;使适应特殊情况;详细说明;列举 generalize  across vt.& vi.概括,归纳;推广,普及;使 ...

  3. 重写外部图片URL,变成自己的URL

     1.获取原图链接 上传一张图片文件到淘图,得到以下链接: https://img.alicdn.com/imgextra/i4/358272220/TB2hCqxmB8lpuFjSspaXXXJKp ...

  4. Chrome如何访问外网

    分享一下谷歌Chrome浏览器如何访问外网(FQ) 1.请确保你已经安装谷歌浏览器,同时能上网 2. 访问外网需要下载谷歌浏览器插件,网盘链接 https://pan.baidu.com/s/1R-b ...

  5. Assembly Experiment4

    AIMS & PREPARATIONS of THIS EXPERIMENT: SCREENSHOTS of THIS EXPERIMENT: 1. change 0403h to 0441h ...

  6. 必做作业3:原型化设计:地铁扫码app

    一.设计背景 伴随着地铁规模的快速扩张,使用手机扫码进出站成为了一种新型的地铁出行方式.在今天的北京和上海,地铁扫码已经极为普遍,广州和深圳也正在快速普及这种新方式.相信在不久的将来,其他拥有地铁或者 ...

  7. linux子系统ubuntu16.04安装使用xrdp当远程桌面

    参考文献:https://icytown.com/windows/windows-subsystem-for-linux-gui-xubuntu/ https://jingyan.baidu.com/ ...

  8. [noip2016]洛谷2827

    来一发文字证明~ 数据范围很大... 如果用priority_queue搞的话肯定是会t的. 所以肯定要想一想优化的思路. 我们发现,对于队列来讲,同加,减是不改变这个队列的大小关系的: 但是呢,切开 ...

  9. 思科模拟器-DHCP配置

    一.如图做好以下拓扑图(下图我取消显示端口号) 二.配置最下面的四台上网终端为自动获取ip 三.配置中间的二层交换机:添加vlan,同时所有端口设为access类型并将其加入vlan中,以下以swit ...

  10. PageHelper 自动去掉排序参数问题

    PageHelper.startPage( req.getCurrent()   , req.getSize() ,"ordersCreateDate desc" ); 如果 上面 ...