• 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",很自然的可以认为其中的元素也是常量地址,对一个有编译期内容的常量地址取值理论上可以在编译器确定结果,但实际上按旧语法却不能直接拿去做为常量使用而是当作变量。

     

     

  • 相关阅读:
    变量与作用域
    安装node和grunt
    神奇的万维网
    大小写字母的转换
    跨域的方法
    选择器中含有空格的注意事项
    Tools
    jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别
    网页中的foot底部定位问题
    CSS hack
  • 原文地址:https://www.cnblogs.com/litifeng/p/10293949.html
Copyright © 2020-2023  润新知