Modern C++ 之constexpr

引言

C++在很早就有了常量表达式的概念,例如3+4,常量表达式是指值不会改变并且在编译过程中就可以得到结果的表达式。如果常量表达式可以直接优化并且在程序编译阶段的时候就写入程序中,将会提高程序的性能。下面就用一个简单的数组例子来说明

#include <iostream>
#define LEN 10

int len_foo()
{
    return 2;
}

constexpr int len_foo_constexpr()
{
    return 5;
}

constexpr int fibonacci(const int n)
{
    return n == 1 || n == 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
}

int main()
{
    char arr_1[10];    // 合法定义
    char arr_2[LEN];    // 合法定义
    
    int len = 3;
    // char arr_3[len]; 这是不合法定义

   const int len_2 = len + 1;
    // char arr_4[len_2];    len_2 不是常量表达式,不合法

    constexpr int len_3 = 1 + 2;    
    char arr_5[len_3];    // 合法定义

    // char arr_6[len_foo() + 4);    非法定义
    char arr_7[len_foo_constexpr() + 2);    // 合法定义

    std::cout << fibonacci(10) << std::endl;

    return 0;
}

在上面的例子中,char arr_4[len_2] 仍然是非法定义的,这是因为len_2是常量,而不是常量表达式。虽然在上面的例子中我们自己可以明显看出来某些函数返回的就是常量,但是编译器认为不行,这不符合人们的常识。为了解决前面的困惑,C++引入了新的关键字constexpr.

constexpt可以明确的说明某个函数或者对象在编译的时候就是一个常量表达式,例如上面的函数len_foo_constexpr的返回值就是一个常量表达式。

并且,从C++14开始,constexpr函数就可以在函数内部,例如在循环或者局部变量等地方使用一些简单的语句,例如上面例子的fibonacci函数,这段函数代码在C++11以前是不能够编译通过的;

总结

  • const可以用来修饰常量,并且只有初始值是常量表达式的时候,const的修饰对象才是一个常量表达式,否则就是一个常量;
  • constexpr用来定义常量表达式,也就是说我们认为某个值就是常量表达式的时候就可以使用constexpr;

猜你喜欢

转载自www.cnblogs.com/zuixime0515/p/12466424.html