博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
constexpr关键字
阅读量:4182 次
发布时间:2019-05-26

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

constexpr是11新标准规定的规定的关键字。有时我们很难分辨一个初始值是不是常量表达式,当然可以定义一个 
const变量并把它的初始值设为我们认为的某个常量表达式,但在实际使用时,尽管要求如此却常常发现初始值并非常量 
表达式的情况。可以说,这时的对象的定义与使用根本就是两回事。

C++11新标准规定,允许将变量声明为constexpr类型让编译器来验证变量的值是否是一个常量表达式。 
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化: 
constexpr int mf = 0; // 0 是常量表达式 
constexpr int limit = mf + 1; // mf + 1 是常量表达式 
constexpr int sz = size(); // 只有当 size() 是一个constexpr函数时才是一条正确的声明语句

constexpr函数要求所定义的函数足够简单以使得编译时就可以计算其结果

constexpr int Dec(int i){ return i-1; }      
1
2
1
2

constexpr还能修饰类的构造函数,即保证传递给该构造函数的所有参数都是constexpr,那么产生的对象的所有成员都是constexpr, 
该对象也是constexpr对象了,可用于只使用constexpr的场合。 
**注意**constexpr构造函数的函数体必须为空,所有成员变量的初始化都放到初始化列表中。

class Test {    public:         constexpr Test(int arg1, int arg2) : v1(arg1), v2(arg2) {}    private:        int v1;        int v2; }constexpr Test A(1,2)enum e = {x = A.v1, y = A.v2}; 
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

使用constexpr的好处

  1. 是一种很强的约束,更好的保证程序的正确定语义不被破坏;
  2. 编译器可以对constexper代码进行非常大的优化,例如:将用到的constexpr表达式直接替换成结果;
  3. 相比宏来说没有额外的开销。

但令人伤心的是,vs2010拒绝此关键字加入语言核心,IDE根本就不认识constexpr, 
至于最新版本是否支持,我尚未,希望将来能够使用。

转载地址:http://jczoi.baihongyu.com/

你可能感兴趣的文章
【Java并发编程实战】——Java内存模型与线程
查看>>
Java复制文件的4种方式
查看>>
mysql的JDBC连接工具类
查看>>
利用多线程(用到原子类AtomicInteger)往数据库批量插入大量数据
查看>>
多个线程操作数组
查看>>
定长线程池的应用
查看>>
ArrayBlockingQueue的简单使用
查看>>
Git 常用命令总结(一)
查看>>
Git 常用命令总结(二)
查看>>
JAVA 并发——synchronized的分析
查看>>
Echarts——使用 dataset 管理数据
查看>>
DES 加解密工具类
查看>>
SpringBoot多模块项目实践(Multi-Module)
查看>>
第一篇: 服务的注册与发现Eureka(Greenwich版)
查看>>
第二篇: 服务消费者(rest+ribbon)(Greenwich版本)
查看>>
第三篇: 服务消费者(Feign)(Greenwich版本)
查看>>
获取客户的真实IP地址
查看>>
第四篇: 熔断器(Ribbon+Feign)(Greenwich版本)
查看>>
Linux的常用命令(一)
查看>>
Linux的常用命令(二)
查看>>