首页 > 编程语言 >C++ auto 类型推断注意的地方

C++ auto 类型推断注意的地方

时间:2024-09-15 20:24:42浏览次数:7  
标签:ci const 常量 int auto C++ 引用 推断

int i=0, &r = i;
auto a=r;         // a是一个整数(r是i的别名,而i是一个整数)                      int a

auto 一般会忽略掉顶层 const(参见 2.4.3节,第57页),同时底层 const 则会保留下来,比如当初始值是一个指向常量的指针时:

const int ci=i, &cr=ci; 
auto b = ci;      //b是一个整数(ci的顶层 const 特性被忽略掉了)                   int b
auto c = cr;      //c是一个整数(cr是ci的别名,ci本身是一个顶层const)              int c
auto d = &i;      //d是一个整型指针(整数的地址就是指向整数的指针)                  int *d
auto e = &ci;     //e是一个指向整数常量的指针(对常量对象取地址是一种底层 const)    const int *e

如果希望推断出的auto类型是一个顶层const,需要明确指出:

const auto f=ci;   // ci的推演类型是int,f是const int

还可以将引用的类型设为 auto,此时原来的初始化规则仍然适用:

auto &g=ci;        //g是一个整型常量引用,绑定到ci
auto &h=42;        //错误:不能为非常量引用绑定字面值
const auto &j= 42; //正确:可以为常量引用绑定字面值

设置一个类型为auto的引用时,初始值中的顶层常量属性仍然保留(//引用毕竟是别名,当然要一样)。和往常一样,如果我们给初始值绑定一个引用,则此时的常量就不是顶层常量了。

要在一条语句中定义多个变量,切记,符号 &*只从属于某个声明符,而非基本数据类型的一部分,因此初始值必须是同一种类型:

auto k=ci,&l=i;        //k是整数,1是整型引用
auto&m=ci,*p= &ci;    // m是对整型常量的引用,p是指向整型常量的指针
//错误:i的类型是int而&ci的类型是 const int
auto &n=i,*p2 = &ci;




《C++ Primer》 P62

标签:ci,const,常量,int,auto,C++,引用,推断
From: https://www.cnblogs.com/huvjie/p/18415583

相关文章

  • [Whole Web] Auto check application website's updates
    Inaproductionenvironment,wewanttoprompttheuserwithamessagewhennewscriptsareavailable,askingNewscriptsareavailable.Doyouwanttoupdate?Theideaisstraightforward:periodically(e.g.,everyminute,10seconds,dependsonyourcase......
  • C++的习题
    C++的习题类与对象习题1:(const成员函数)假设AA是一个类,AA*abc()const是该类的一个成员函数的原型。若该函数返回this值,当用x.abc()调用该成员函数后,x的值是()A.可能被改变B.已经被改变C.受到函数调用的影响D.不变A.此成员函数被定义为const常方法,代表在......
  • C++中对象的延迟构造
    本文并不讨论“延迟初始化”或者是“懒加载的单例”那样的东西,本文要讨论的是分配某一类型所需的空间后不对类型进行构造(即对象的lifetime没有开始),更通俗点说,就是跳过对象的构造函数执行。使用场景我们知道,不管是定义某个类型的对象还是用operatornew申请内存,对象的构造函数都......
  • C++ typedef 类型别名注意的地方
    指针、常量和类型别名如果某个类型别名指代的是复合类型或常量,那么把它用到声明语句里就会产生意想不到的后果。例如下面的声明语句用到了类型pstring,它实际上是类型char*的别名typedefchar*pstring;constpstringcstr=0;//cstr是指向char的常量指针constpstring*ps;......
  • 矩阵连乘(动态规划)(C/C++)最详尽代码注释
    写在所有的前面:本文采用C/C++实现代码目录写在所有的前面:题目说明题目题目出处题目描述Description输入Input输出Output样例Sample限制Hint解答说明方案1:最优分隔点法(动态规划)解题思路代码实现c语言头文件:c++头文件主代码部分:(详尽版本1)主代码部分(题目对应版本)其他解......
  • C++链接的那些事
    接上文OK!Rightnow!  Let's go!今天我们来谈谈链接,什么是链接,C++链接实际上做什么的?链接是一个过程,当我们从源C++文件转到实际的可执行文件(二进制文件)。第一阶段是编译源文件,一旦我们把文件编译好,就需要通过一个叫做链接的过程,现在链接的主要工作是找到每个符号和......
  • C++编译 链接 执行那些事
    OK!Rightnow!  Let's go!如何从源文件开始,实际的文本文档到可执行的二进制代码,写C++程序的基本流程。实际是你有一些C++的源文件,然后将这些源文件给到编译器,编译器将其转成二进制的东西,二进制的东西可能是某种库,或者是可执行的程序。在#符号之后的都是预处理语句......
  • 「数组」堆排序 / 大根堆优化(C++)
    目录概述核心概念:堆堆结构数组存堆思路算法过程up()down()Code优化方案大根堆优化Code(pro)复杂度总结概述在「数组」快速排序/随机值优化|小区间插入优化(C++)中,我们介绍了三种基本排序中的冒泡排序与分治思想结合的算法:快速排序。本文我们来讲第二种基本排......
  • 详解c++多态---上
    virtual关键字1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。classPerson{public:virtualvoidBuyTicket(){cout<<"买票-全价"<<endl;}};classStudent:publicPerson{public:virtualvoidBuyTicket(){cout<<"买票-半价"<<......
  • c++走出迷宫改良版2
    本文对上期做了删改话不多说上代码:注彩色输出部分代码出自博主夜若渊#include<bits/stdc++.h>#include<windows.h>#include<stdlib.h>#include<cstdio>#include<iostream>#include<string>#include<stdio.h>#include<ctime>#include<conio.h&g......