What are 'constexpr' useful for?

前端 未结 4 523
说谎
说谎 2021-02-04 06:07

I really can\'t find any use of it. My first idea was that I could use it to implement \'Design by Contract\' without using macros like this:

struct S
{   
    S         


        
4条回答
  •  梦谈多话
    2021-02-04 06:34

    The goal of constexpr depends on the context:

    1. For objects it indicates that the object is immutable and shall be constructed at compile-time. Aside from moving operations to compile-time rather than doing them at run-time creating constexpr objects has the added advantage that they are initialize before any threads are created. As a result, their access never needs any synchronization. An example of declaring an object as constexpr would look like this:

      constexpr T value{args};
      

      Obviously, for that to work, args need to be constant expressions.

    2. For functions it indicates that calling the function can result in a constant expression. Whether the result of constexpr function call results in a constant expression depends on the arguments and the definition of the function. The immediate implication is that the function has to be inline (it will implicitly be made so). In addition, there are constraints on what can be done within such a function. For C++11 the function can have only one statement which, for non-constructors, has to be a return-statement. This restriction got relaxed in C++14. For example, the following is a definition of a constexpr function:

      constexpr int square(int value) { return value * value; }
      

    When creating constexpr object of non-built-in types the respective types will need a constexpr constructor: the generated default constructor won't work. Obviously, a constexpr constructor will need to initialize all members. A constexpr constructor could look like this:

    struct example {
        int value;
        constexpr example(int value): value(value) {}
    };
    
    int main() {
        constexpr example size{17};
        int array[size.value] = {};
    }
    

    The created constexpr values can be used everywhere a constant expression is expected.

提交回复
热议问题