zoukankan      html  css  js  c++  java
  • constexpr与常量表达式(c++11标准)

    关键字 constexpr 是C++11中引入的关键字,是指值不会改变并且在编译过程中就得到计算结果的表达式。(运行中得到结果的不能成为常量表达式,比如变量)。

    声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

    constexpr int i=3;
    constexpr int j=i+1;
    constexpr int k=f(); //只有f()是一个constexpr函数时k才是一个常量表达式

    一般来说,若果一旦认定变量是一个常量表达式,那就把它声明为constexpr类型

    常量表达式机制是为了:

    1、提供了更多的通用的值不发生变化的表达式
    2、允许用户自定义的类型成为常量表达式
    3、提供了一种保证在编译期完成初始化的方法(可以在编译时期执行某些函数调用)

    语义上:
    constexpr:告诉编译器我可以是编译期间可知的,尽情的优化我吧。
    const:告诉程序员没人动得了我,放心的把我传出去;或者放心的把变量交给我,我啥也不动就瞅瞅。

    语法上:
    constexpr是一种比const 更严格的束缚, 它修饰的表达式本身在编译期间可知, 并且编译器会尽可能的 evaluate at compile time. 在constexpr 出现之前, 可以在编译期初始化的const都是implicit constexpr. 直到c++ 11, constexpr才从const中细分出来成为一个关键字, 而 const从1983年 c++ 刚改名的时候就存在了

    csdn论坛上看见大神的一段短话,摘录下来,很值的体会

    constexpr:不光是可以取代模板是某些常量的表达更简洁,其实一个决定性的作用是支持地址类常量。这恰好补上了模板缺失的部分。比如有一个字符串常量"abc",很自然的可以认为其中的元素也是常量地址,对一个有编译期内容的常量地址取值理论上可以在编译器确定结果,但实际上按旧语法却不能直接拿去做为常量使用而是当作变量。

     

     

  • 相关阅读:
    设计模式享元模式实现C++
    并查集
    设计模式代理模式实现C++
    设计模式装饰模式实现C++
    最小生成树Prim算法实现
    图的邻接矩阵存储
    威佐夫博弈(Wythoff Game)初识 HDU 1527 POJ 1067
    设计模式原型模式实现C++
    三种经典博弈问题 BashGame;WythoffGame;NimmGame;
    设计模式外观模式实现C++
  • 原文地址:https://www.cnblogs.com/litifeng/p/10293949.html
Copyright © 2011-2022 走看看