C++ const 和 constexpr的区别
const只是声明变量类型/函数返回类型为常量,不能改动。
constexpr修饰变量/函数是显式告知编译器“我是常量,不要在多费功夫了,直接把我替换为常量加入汇编代码!”。
比如下面这样的函数或者变量都是这种情况:
1 constexpr int x=1; 2 int constexpr f(){ 3 return 1; 4 }
C++11中的constexpr指定的函数返回值和参数必须要保证是字面值,而且必须有且只有一行return代码,这给函数的设计者带来了更多的限制,比如通常只能通过return 三目运算符+递归来计算返回的字面值。
函数中除了return还有一个没卵用的表达式,C++11就会报错:
但C++14之后就不再有这么严格的限制了,只要保证返回值和参数是字面值就行了,函数体中可以加入更多的语句,方便了更灵活的计算。
上面一样的代码在C++17下跑就可以运行成功:
对于较新的C++编译器,constexpr更多的是一个建议,即使你的函数中甚至都返回的不是常量,编译器也不会报错,而是把它当成一个普通函数对待,如下:
注:这里我发现我的编译器居然能用变量来声明数组大小。后来查了相关资料,发现这是C99的特性,本来C++是不支持的,但应该是我下的mingw库自带支持C99的关系。这个可以忽略,平时不要这么写!
也就是说编译器还是很聪明的,你骗编译器说我是一个返回常量的函数,但编译器还是会检查并决定到底要不要优化你,如果发现你骗了它也不会报错。
进击的小🐴农