C++:constexpr 和 const 的区别

constexpr 是 C++ 11 标准新添加的关键字,原先的标准中是只有const关键字的,作用是表示只读常量。但是,其实只读常量是两个属性,分为只读和常量,都用const来表示会产生歧义。

看下面的例子

#include 
#include 
using namespace std;


const int func1(){
    return 10;
}

int main(){
    
    array arr1;

    return 0;
}

对于arr1,虽然我们传入的也是一个常量,但是,const 返回类型仅仅表示a是一个只读属性的变量,而不是一个常量。只读变量和常量之间,是有区别的,明确这点非常重要。所以上面的例子中,func1编译会报错,报错信息为如下。

\test.cpp: In function ‘int main()’:
test.cpp:16:21: error: call to non-‘constexpr’ function ‘const int func1()’
   16 |     array arr1;
      |                ~~~~~^~

这里补充const的一个重要概念就是,const后面的变量,仅仅表示不能通过该变量改变背后实际的值,但是如果其他变量也能够表示同一块内存空间,这个内存空间里的值是可以通过其他变量来改变的。

上面的程序做如下修改,arr2就可以正常的编译,因为传入的是一个constexpr代表的常量类型。

#include 
#include 
using namespace std;


const int func1(){
    return 10;
}

constexpr int func2(){
    return 20;
}

int main(){
    
    // array arr1;
    array arr2;

    return 0;
}

constexpr的出现,就是将原先只读常量是只读还是常量的模糊边界区分开,分成了只读属性(使用const),和常量属性(使用constexpr)

其实还有编译阶段的不同,后面有空再补充。。。

你可能感兴趣的:(C++,c++,开发语言)