C++11常用特性介绍——decltype关键字
一、decltype的意义
有时我们只想从表达式的类型推断出要定义的变量类型,但是不想用其值进行初始化的时候,C++11新标准引入了decltype类型说明符,它的作用是选择并返回操作数的数据类型,在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值。
二、decltype的用法
1)基本用法
int getInt();
int main()
{
int a = 1;
decltype(a) b; //b为int类型。
decltype(getInt()) c; //c为int类型,即使getInt()根本没定义,但程序依旧正常,因为decltype只做分析,并不调用getInt()。
return 0;
}
2)与const结合
const int a= 0, &b = a;
decltype(a) c = 0; //c为const int类型,必须初始化
decltype(b) d = c; //d为const int&类型,必须初始化
decltype(b) e; //错误,e为const int&类型,必须初始化
注:从上面的例子可以看出,decltype不会忽略顶层的const,而是保留,这是和auto的一个区别。
3)与引用结合
int a = 1,*b = &a,&c = a;
decltype(a) d = 0; //d为int类型
decltype(b) e = &d; //e为int*类型
decltype(*b) f = d; //f为int&类型(表达式内容为解引用操作,可以这么理解,b是指针,而对*b的操作会影响到d的值,和引用功能相同)
decltype(c) g = d; //g为int&类型
decltype(c+1) h = d; //h为int类型,c的类型为int&,但是c+1表达式计算之后返回的类型是int,因此h的类型是int
std::cout << d << std::endl; //输出0(输出d的值)
std::cout << ++(*e) <<std::endl;//输出1(d先自加1变为1,再输出)
std::cout << ++f <<std::endl; //输出2(d先自加1变成2,再输出)
std::cout << ++g << std::endl; //输出3(d先自加1变成3,再输出)
std::cout << ++h << std::end; //输出1(h先自加1变成1,再输出)
4)与括号
int a = 1;
decltype((a)) b = 2;//b为int&类型,必须初始化
注:如果一个表达式的类型不是引用,但是我们需要推断该类型的引用,那么可以加上一对括号,就变成了引用类型。
5)与函数返回类型
template <typename T1,typename T2>
auto Func(T1 t1,T2 t2> -> decltype(t1 * t2)
{
return t1 * t2;
}
6)总结
decltype和auto都可以用来推断类型,但二者有几处明显的差异:
1、auto忽略顶层const、decltype保留顶层const。
2、对引用操作,auto推断原有类型;decltype推断出引用。
3、对解引用的操作,auto推断出原有类型;decltype推断出引用。
4、auto推断时会实际执行,decltype不会执行,只做分析。
C++11常用特性介绍——decltype关键字的更多相关文章
- C++11常用特性介绍——nullptr关键字及用法
一.nullptr关键字及用法 1)NULL的二义性 void func(int) {} void func(int*) {} 当函数调用func(NULL)时会执行哪个函数呢? 先看C++对NULL ...
- C++11常用特性介绍——auto类型修饰符
1.C++11常用特性介绍 从本篇开始介绍C++11常用特性,大致分:关键字及新语法.STL容器.多线程.智能指针内存管理,最后讲一下std::bind和std::function 二.关键字和新语法 ...
- C++98常用特性介绍——mutable关键字
讲mutable前,先讲一下const函数,讲const函数前,先讲一下函数前后加const的区别 一.C++函数前后加const的区别 1)函数前加const:普通函数或非静态成员函数前均可加con ...
- C++11常用特性介绍——array容器
std::array是具有固定大小的数组,支持快速随机访问,不能添加或删除元素,定义于头文件<array>中. 一.概要 array是C++11新引入的容器类型,与内置数组相比,array ...
- C++11常用特性介绍——列表初始化
一.列表初始化 1)C++11以前,定义初始化的几种不同形式,如下: int data = 0; //赋值初始化 int data = {0}; //花括号初始化 int data(0); / ...
- C++11常用特性介绍——Lambda表达式
一.C++11采用配对的方括号[]来创建一个匿名函数并执行,如: #include <iostream> int main() { auto func = []{ std::cout &l ...
- C++11常用特性介绍——左值引用、右值引用
一.左值.右值 1)左值:可以放在赋值号左侧.可以被赋值的值:左值必须要在内存中有实体. 2)右值:必须放在赋值号右侧.取出值赋值给其它变量:右值可以在内存中也可以在CPU寄存器中. 二.引用 引用是 ...
- C++11常用特性介绍——constexpr变量
一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: in ...
- C++11常用特性介绍——for循环新用法
一.for循环新用法——基于范围的for循环 for(元素类型 元素对象 : 容器对象) { //遍历 } 1)遍历字符串 std::string str = "hello world&qu ...
随机推荐
- springboot中配置addResourceHandler和addResourceLocations,使得可以从磁盘中读取图片、视频、音频等
磁盘目录 WebMvcConfig的代码 //对静态资源的配置 @Override public void addResourceHandlers(ResourceHandlerRegistry re ...
- 通过scrapy,从模拟登录开始爬取知乎的问答数据
这篇文章将讲解如何爬取知乎上面的问答数据. 首先,我们需要知道,想要爬取知乎上面的数据,第一步肯定是登录,所以我们先介绍一下模拟登录: 先说一下我的思路: 1.首先我们需要控制登录的入口,重写star ...
- Qt5 error LNK2019 无法解析的外部符号的解决办法
今天在使用Qt Create 4.5.2时遇到一个莫名其妙的问题: 在原有工程里添加一个新类(有界面的),在调用的mainwindow.cpp中添加#include "a.h",然 ...
- shell脚本编程学习笔记(四)shell操作数据库
一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...
- PAT甲级题解分类byZlc
专题一 字符串处理 A1001 Format(20) #include<cstdio> int main () { ]; int a,b,sum; scanf ("%d %d& ...
- python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计
1.完整代码: import time import urllib.request #发送网络请求,获取数据 import gzip #压缩和解压缩模块 import json #解析获得的数据 fr ...
- Swiper 移动端全屏轮播图效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- 转载: HDMI 基础知识
转自:http://www.cnblogs.com/TaigaCon/p/3840653.html HDMI,全称为(High Definition Multimedia Interface)高清多媒 ...
- WEB - 关于rel="noopener"
参考网址 https://mathiasbynens.github.io/rel-noopener/ 例子 <a href="https://cli.vuejs.org" t ...
- webpack初学踩坑记
注意事项: 1. webpack不用装在全局环境下,在哪个项目中使用,就安装在该项目下即可 1. 问题一:npm init 初始化一个项目后,添加webpack.config.js文件,在该项目中通过 ...