博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Visual C++学习杂谈2(constexpr变量、const与auto,using/typedef类型别名)
阅读量:5096 次
发布时间:2019-06-13

本文共 1181 字,大约阅读时间需要 3 分钟。

constexpr变量:

由于常量表达式在实际编程中比较难判断,所以c++引入constexpr来判断一个表达式是否为constexpr。

被声明为constexpr的表达式一定是一个常量表达式,如果不是,编译器则会在编译阶段报错。
一般说来,如果你认定变量是常量表达式,那就把它声明为constexpr类型。

例子:

constexpr int size = 100; // 正确。
constexpr auto charN = cin.get(); // 错误,cin.get()不是一个常量表达式。

可以被定义为constexpr的类型包括【算术类型】【引用】【指针】;这些类型被称为字面值类型。
如果constexpr定义的是一个指针,则限定符constexpr仅对指针有效,对指针所指的对象无关。

注意:自定义类、Sales_item、IO库、string类型则不属于字面值类型。(涉及编译原理,了解并不多)

---------------------------------------------------------------------------------------------------

非指针类型的const在作为auto的判断符时,会被auto忽略。

const int cr = 12;

auto p = 12; // p的类型为int;

指针类型的底层const不会被忽略;

const int *ci = &cr;

auto p1 = ci; // p1的类型为const int *;

 

在利用类型别名定义const对象和原本的类型名定义const对象是有差别的。

#include <iostream>

using namespace std;

using pstring = char *;

int main() {

const char *str = nullptr; // 指向的是一个 常量对象 的 常量指针

const pstring cstr = nullptr; // 指向的是一个 普通对象 的 指针常量
}

所以在定义过程中有“*”和没有“*” 定义变量的过程是不一样的,编译器会按照不同的方式处理。

那么类似于如下写法:

#include <iostream>

using namespace std;

using pstring = char *;

int main() {

const char i = '4';

const pstring p = &i; // 错误,p只是一个常量指针,而非指向常量对象的指针;
}
是不是非常的迷惑人?
由以上两点就很容易看出,这种写法当然是错的。

 

转载于:https://www.cnblogs.com/xiaodukuko/p/5266319.html

你可能感兴趣的文章
hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图
查看>>
简单将集合的内容转为字符串
查看>>
Python pandas 0.19.1 Intro to Data Structures 数据结构介绍 文档翻译
查看>>
《寿康宝鉴》
查看>>
CentOS7下安装jdk8环境
查看>>
Mongodb
查看>>
struts2 DMI
查看>>
管道和I/O重定向
查看>>
django重点url,视图函数,模板语言
查看>>
Base64编码与图片互转
查看>>
bzoj 3997 Dilworth定理
查看>>
web在线页面编辑实现-abtest可视化实验
查看>>
iOS直播技术学习笔记 iOS中实现推流(八)
查看>>
搞懂JavaScript引擎运行原理
查看>>
Java--语法
查看>>
设计模式(一)
查看>>
Java--面向对象
查看>>
线程池(二)
查看>>
Java--异常、反射
查看>>
NIO
查看>>