Difference between `constexpr` and `const`

后端 未结 9 1468
无人共我
无人共我 2020-11-22 03:48

What\'s the difference between constexpr and const?

  • When can I use only one of them?
  • When can I use both and how should I
相关标签:
9条回答
  • 2020-11-22 04:28

    According to book of "The C++ Programming Language 4th Editon" by Bjarne Stroustrup
    const: meaning roughly ‘‘I promise not to change this value’’ (§7.5). This is used primarily to specify interfaces, so that data can be passed to functions without fear of it being modified.
    The compiler enforces the promise made by const.
    constexpr: meaning roughly ‘‘to be evaluated at compile time’’ (§10.4). This is used primarily to specify constants, to allow
    For example:

    const int dmv = 17; // dmv is a named constant
    int var = 17; // var is not a constant
    constexpr double max1 = 1.4*square(dmv); // OK if square(17) is a constant expression
    constexpr double max2 = 1.4∗square(var); // error : var is not a constant expression
    const double max3 = 1.4∗square(var); //OK, may be evaluated at run time
    double sum(const vector<double>&); // sum will not modify its argument (§2.2.5)
    vector<double> v {1.2, 3.4, 4.5}; // v is not a constant
    const double s1 = sum(v); // OK: evaluated at run time
    constexpr double s2 = sum(v); // error : sum(v) not constant expression
    

    For a function to be usable in a constant expression, that is, in an expression that will be evaluated by the compiler, it must be defined constexpr.
    For example:

    constexpr double square(double x) { return x∗x; }
    


    To be constexpr, a function must be rather simple: just a return-statement computing a value. A constexpr function can be used for non-constant arguments, but when that is done the result is not a constant expression. We allow a constexpr function to be called with non-constant-expression arguments in contexts that do not require constant expressions, so that we don’t hav e to define essentially the same function twice: once for constant expressions and once for variables.
    In a few places, constant expressions are required by language rules (e.g., array bounds (§2.2.5, §7.3), case labels (§2.2.4, §9.4.2), some template arguments (§25.2), and constants declared using constexpr). In other cases, compile-time evaluation is important for performance. Independently of performance issues, the notion of immutability (of an object with an unchangeable state) is an important design concern (§10.4).

    0 讨论(0)
  • 2020-11-22 04:30

    const applies for variables, and prevents them from being modified in your code.

    constexpr tells the compiler that this expression results in a compile time constant value, so it can be used in places like array lengths, assigning to const variables, etc. The link given by Oli has a lot of excellent examples.

    Basically they are 2 different concepts altogether, and can (and should) be used together.

    0 讨论(0)
  • 2020-11-22 04:34

    As @0x499602d2 already pointed out, const only ensures that a value cannot be changed after initialization where as constexpr (introduced in C++11) guarantees the variable is a compile time constant.
    Consider the following example(from LearnCpp.com):

    cout << "Enter your age: ";
    int age;
    cin >> age;
    
    const int myAge{age};        // works
    constexpr int someAge{age};  // error: age can only be resolved at runtime
    
    0 讨论(0)
提交回复
热议问题