首页 > 编程语言 >C++ 面经 ----- C++11新特性:auto & decltype 类型推导

C++ 面经 ----- C++11新特性:auto & decltype 类型推导

时间:2022-11-08 20:55:23浏览次数:73  
标签:11 decltype 推导 int auto C++ 类型 const

C++11引入了auto和decltype关键字

使用他们可以在编译期就推导出变量或者表达式的类型,方便开发者编码也简化了代码。

 

auto示例

auto a = 10; // 10是int型,可以自动推导出a是int

int i = 10;
auto b = i; // b是int型

auto d = 2.0; // d是double型

这就是auto的基本用法,可以通过=右边的类型推导出变量的类型。

 

auto推导规则

int i = 10;
auto a = i, &b = i, *c = &i; // a是int,b是i的引用,c是i的指针,auto就相当于int
auto d = 0, f = 1.0; // error,0和1.0类型不同,对于编译器有二义性,没法推导
auto e; // error,使用auto必须马上初始化,否则无法推导类型
void func(auto value) {} // error,auto不能用作函数参数

class A {
    auto a = 1; // error,在类中auto不能用作非静态成员变量
C++规定,const的静态成员可以直接在类内初始化,而非const的静态成员需要在类外声明以初始化。对于后一种情况,我们一般选择在类的实现文件中初始化。
static auto b = 1; // error,这里与auto无关,正常static int b = 1也不可以 static const auto c = 1; // ok }; void func2() { int a[10] = {0}; auto b = a; // ok auto c[10] = a; // error,auto不能定义数组,可以定义指针 vector<int> d; vector<auto> f = d; // error,auto无法推导出模板参数 }

补充:C++规定,const的静态成员可以直接在类内初始化,而非const的静态成员需要在类外声明以初始化。对于后一种情况,我们一般选择在类的实现文件中初始化。

auto的限制:

  • auto的使用必须马上初始化,否则无法推导出类型
  • auto在一行定义多个变量时,各个变量的推导不能产生二义性,否则编译失败
  • auto不能用作函数参数
  • 在类中auto不能用作非静态成员变量
  • auto不能定义数组,可以定义指针
  • auto无法推导出模板参数

auto补充:

int i = 0;
auto *a = &i; // a是int*
auto &b = i; // b是int&
auto c = b; // c是int,忽略了引用

const auto d = i; // d是const int
auto e = d; // e是int

const auto& f = e; // f是const int&
auto &g = f; // g是const int&

首先介绍下cv是指const 和volatile

  • 在不声明为引用或指针时,auto会忽略等号右边的引用类型和cv限定

 

  • 在声明为引用或者指针时,auto会保留等号右边的引用和cv属性

复杂类型尽可能使用auto

 

decltype示例

auto用于推导变量类型,而decltype则用于推导表达式类型

int func() { return 0; }
decltype(func()) i; // i为int类型

int x = 0;
decltype(x) y; // y是int类型
decltype(x + y) z; // z是int类型

注意:decltype不会像auto一样忽略引用和cv属性,decltype会保留表达式的引用和cv属

const int &i = 1;
int a = 2;
decltype(i) b = 2; // b是const int&

 

decltype推导规则

对于decltype(exp)有

  • exp是表达式,decltype(exp)和exp类型相同
  • exp是函数调用,decltype(exp)和函数返回值类型相同
  • 其它情况,若exp是左值,decltype(exp)是exp类型的左值引用
int a = 0, b = 0;
decltype(a + b) c = 0; // c是int,因为(a+b)返回一个右值
decltype(a += b) d = c;// d是int&,因为(a+=b)返回一个左值

d = 20;
cout << "c " << c << endl; // 输出c 20

auto和decltype的配合使用

template<typename T, typename U>
return_value add(T t, U u) { // t和v类型不确定,无法推导出return_value类型
    return t + u;
}

上面代码由于t和u类型不确定,那如何推导出返回值类型呢,我们可能会想到这种

template<typename T, typename U>
decltype(t + u) add(T t, U u) { // t和u尚未定义
    return t + u;
}

这段代码在C++11上是编译不过的,因为在decltype(t +u)推导时,t和u尚未定义,就会编译出错,所以有了下面的叫做返回类型后置的配合使用方法:

template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
    return t + u;
}

返回值后置类型语法就是为了解决函数返回制类型依赖于参数但却难以确定返回值类型的问题。

 

C++11的类型推导详解 - 知乎 (zhihu.com) 

标签:11,decltype,推导,int,auto,C++,类型,const
From: https://www.cnblogs.com/slowlydance2me/p/16871150.html

相关文章

  • 【流水】2022.11.08
    今天有是信息课看python,孩子人傻了赶紧luogu上用python水了几道题。今天考试除了暴力分拿的十分健全就没啥优点了可怜紫飨被gank到三机房去了,可怜(悲听说要......
  • 2022.11.08 NOIP2022 模拟赛五
    「LibreOJNOIPRound#1」DNA序列注意到\(k=10\),\(|\Sigma|=4\),故本质不同的子串个数只有\(4^10\)种,可以直接压位存下来。时间复杂度\(O(nk)\)。Codeconstint......
  • 闲话 22.11.8
    今天没有准备什么题(所以今天又是久违的纯闲话!但是今天下午想了这么一道题:给定\(n\)个区间\([l_i,r_i]\(0\lei<n)\)。设\(n\)阶多项式\(F(x)\)满足任意非常......
  • 11.8.4
    #include<stdio.h>intmain(){intn,i,x;intarr[100];scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&arr[i]); }scanf("%d",&x);for(i=0;i<n;i++){if(x!=arr[i]......
  • 11.8.5
    #include<stdio.h>intmain(){intarr[100];intn,i,j;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&arr[i]);}if(n==0)printf("");else{printf("%d",arr[0]);......
  • 2022-11 学习计划
    2022-11学习计划技术redis源码基本类型aeNet集群技术实现调优和配置项分析分布式锁事务,内存,阻塞,发布,订阅redis+mysql双写一致性node源码......
  • 11.8
    前段时间姑姑发了个视频来问我我下意识以为是发来考我的水平,但是打开发现是个企业的宣传视频于是我又开始想是不是姑姑质问我秋招有没有好好准备但是她只是自嘲地说这个......
  • 11.08
    今日内容1.面向对象的魔法方法2.魔法方法笔试题3.元类简介4.创建类的两种方式5.元类定制类的产生行为6.元类定制对象的产生行为7.魔法方法之双下new8.设计模式简介......
  • 使用一条for语句求若干个整数的平均值--C++自学
    #include<iostream>#include<stdlib.h>usingnamespacestd;intmain(){intx,count=0,sum=0;cout<<"输入若干整数:"<<endl;cin>>x;for(;x!=......
  • 11.8 总结
    11.8GZEZNOIP2022模拟测试赛(五十六)T1环:题目描述:对于一个0,1串有两种操作:整体向右移动x位将某个01变成10给你串的长度和1的个数让你构造l个串,满......