zoukankan      html  css  js  c++  java
  • 常量表达式

    常量表达式

    Item 1:如果函数必须在编译期进行求值,就将其声明为constexpr

    理由

    需要用constexpr来告诉编译器允许对其进行编译期求值。

    示例

    阶乘的例子:

    constexpr int fac(int n)    //constexpr函数
    {
    return (n>1) ? n*fac(n-1) : 1;
    }
    
    void f(int n)
    {
    int f5 = fac(5);            //在编译期间可能进行了求值
    int fn = fac(n);            //在运行期间进行了求值(因为实参n是变量)
    constexpr int f6 = fac(6);  //在编译期间进行了求值
    constexpr int fnn = fac(n); //错误:无法在编译期求值,因为n的值在运行期才能得到
    }
    

    上例中给出了constexpr函数fac()的定义,在f()中列举了几种调用fac()的情形。在这里,编译期间能够求值的前提是fac()要为constexpr函数,此外还要保证其实参为常量,表达式被赋值变量为constexpr类型。

    注解

    不要试图让所有函数都变成 constexpr。大多数计算都最好在运行时进行。

    任何可能最终将依赖于高层次的运行时配置或者业务逻辑的API,都不应当是 constexpr 的。这种定制化是无法由编译期来求值的,并且依赖于这种 API 的任何 constexpr 函数也都应当进行重构,或者抛弃掉 constexpr

    Item 2: 以 constexpr 来定义可以在编译期计算的值

    理由

    更好的性能,更好的编译期检查。

    示例
    constexpr int f6 = fac(6);  //在编译期间进行了求值
    constexpr int fnn = fac(n); //错误:无法在编译期求值,因为n的值在运行期才能得到
    
    注解

    将变量声明为constexpr类型,编译器可以来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,并且必须用常量表达式初始化。

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    CF 1083 A. The Fair Nut and the Best Path
    2434: [Noi2011]阿狸的打字机
    HDU 6086 Rikka with String
    HDU 2825 Wireless Password
    异常处理与补充模块
    面向对象
    初始socket
    面向对象的进阶(组合和继承)
    初始面向对象
    python之其他模块的用法
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/9100833.html
Copyright © 2011-2022 走看看