今天来看下C++中的auto和decltype两个关键字

  • auto关键字定义变量,编译器会自动判断变量的类型

举个栗子:

auto i =100;  // i 是 int
auto p = new A(); // p 是 A*
auto k = 34343LL; // k 是 long long

有时,变量的类型名特别长,使用 auto 就会很方便。例如:

map <string, int, greater <string> >mp;
for( auto i = mp.begin(); i != mp.end(); ++i)
cout << i -> first << ", " << i -> second;

编译器会自动识别出i的类型为map <string, int, greater >::iterator

  • decltype关键字可以用于求表达式的类型。

举个栗子

int i;
double t;
struct A { double x; };
const A* a = new A();
decltype(a) x1; //x1 是 A*
decltype(i) x2; //x2 是 int
decltype(a -> x) x3; // x3 是 double

编译器自动将decltype(a)等价于A*

auto和decltype可以一起使用

#include <iostream>
using namespace std;
struct A {
int i;
A(int ii) : i(ii) {}
};
A operator + (int n, const A & a)
{
return A(a.i + n);
}
template <class T1, class T2>
auto add(T1 x, T2 y) -> decltype(x + y) {
return x + y;
}
int main() {
auto d = add(100, 1.5); // d 是 double 类型,d = 101.5
auto k = add(100, A(1)); // k 是 A 类型,因为表达式“100+A(1)”是A类型的
cout << d << endl;
cout << k.i << endl;
return 0;
}

程序的输出结果如下:

101.5

101

第 12 行告诉编译器,add 的返回值类型是decltype(x+y),即返回值的类型和x+y这个表达式的类型一致。编译器将 add 实例化时,会自动推断出x+y的类型。

  • 在 C++11 中,函数返回值若为 auto,则需要和 decltype 配合使用。在 C++14 中,则可以不用 decltype,例如下面的程序没有问题:
auto add (int a, int b)
{
int i = a + b;
return i;
}

参考:http://c.biancheng.net/view/438.html

C++11 auto和decltype关键字的更多相关文章

  1. 【C++】C++11的auto和decltype关键字

    转自: http://www.linuxidc.com/Linux/2015-02/113568.htm 今天要介绍C++11中两个重要的关键字,即auto和decltype.实际上在C++98中,已 ...

  2. C++11 auto and decltype

    1.auto关键字 C++新标准引入auto关键词,此auto与之前C语言的auto意义已经不一样了. 这里的auto是修饰未知变量的类型,编译器会通过此变量的初始化自动推导变量的类型. 例如:aut ...

  3. c++11 auto 与 decltype 详解

    转自: here 一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型.然而做到这一点并非那么容易(特别是模板中),有时候根本做不到.为了解决这个问题 ...

  4. C++11特性:decltype关键字

    decltype简介 我们之前使用的typeid运算符来查询一个变量的类型,这种类型查询在运行时进行.RTTI机制为每一个类型产生一个type_info类型的数据,而typeid查询返回的变量相应ty ...

  5. C++11 auto和decltype推导规则

    VS2015下测试: decltype: class Foo {}; int &func_int_r(void) { int i = 0; return i; }; int && ...

  6. c++11——auto,decltype类型推导

    c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率.     auto和decltype的类型推导都是编译器在 ...

  7. C++11——引入的新关键字

    1.auto auto是旧关键字,在C++11之前,auto用来声明自动变量,表明变量存储在栈,很少使用.在C++11中被赋予了新的含义和作用,用于类型推断. auto关键字主要有两种用途:一是在变量 ...

  8. [转]引用模板类中定义的类型(用typedef或using)以及auto、decltype、typename的使用

    一.背景 使用typedef或者using定义类型别名是非常常见的手段,在c++里面,有时为了封装性,模块性等原因还会在某一个namespace或者class内部定义类型别名. 最近在写c++代码的时 ...

  9. MordernC++之 auto 和 decltype

    在C++11标准中,auto作为关键字被引入,可以用来自动推导变量类型,auto可以用于定义变量,函数返回值,lambda表达式等,在定义变量时可以使用auto来代替具体类型,编译器根据变量初始化表达 ...

  10. C++ 11 学习1:类型自动推导 auto和decltype

    Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习. 使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译 ...

随机推荐

  1. Git - 安装Git

    下载>> 安装 >> 下载 登录Git官网:https://git-scm.com/ 点击想要安装的版本 安装 1. 点击下一步(Next) 2. 选择安装路径 3. Git相 ...

  2. stream流中toMap()api和Duplicate key问题

    1.指定key-value,value是对象中的某个属性值. Map<Integer,String> userMap = userList.stream().collect(Collect ...

  3. [解决方案]无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统中禁止执行脚本

    前言 windows环境,安装vue-cli 脚手架. 安装成功,但是执行 vue -V 报错了. 报错信息:无法加载文件 C:\Users\Administrator\AppData\Roaming ...

  4. python二级 计算生态

    生态地址: https://pypi.python.org/pypi 常用函数:

  5. 百万架构师第四十八课:并发编程的原理(三)|JavaGuide

    原文链接 JavaGuide 并发编程的原理 目标: Lock 的使用 AQS 原理分析 Condition CountDownLatch . Semaphore 线程池分析 J.U.C = java ...

  6. TSP问题的不可近似性

    \(\S\) 结论 TSP问题:n阶带权无向完全图中,找权值最小的哈密顿回路(无向图中遍历所有顶点的回路) 优化问题,记最优解为OPT 对于一般的n顶点TSP问题(非Metric),任意 多项式时间内 ...

  7. 《learn to count everything》论文阅读、实验记录

    <learn to count everything>论文阅读 模式识别这门课最后选了这篇论文汇报,记录一下吧. 参考资料: [论文解读]CVPR2021 | FamNet:密集场景计数统 ...

  8. TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合

    \3c span id="mce_marker" data-mce-type="bookmark">\3c /span>\3c span id=&q ...

  9. Linux 下载安装CUDA Toolkit 12.8,配置Nvidia Driver

    cuda下载地址 https://developer.nvidia.com/cuda-downloads nvidia-smi Mon Mar 17 02:08:35 2025 +---------- ...

  10. oracle各种字符集修改

    select * from v$nls_parameter会显示nls_characterset和nls_nchar_characterset的值 修改字符集nls_characterset和nls_ ...