C++:constexpr 和 const 的区别

constexpr是C++11的新特性,用于区分只读属性和常量属性。文章通过示例讲解了const与constexpr的区别,指出const仅表示变量不可修改其值,而constexpr则在编译时确定其值。

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

看下面的例子

#include <iostream>
#include <array>
using namespace std;


const int func1(){
    return 10;
}

int main(){
    
    array<int, func1()> 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<int, func1()> arr1;
      |                ~~~~~^~

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

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

#include <iostream>
#include <array>
using namespace std;


const int func1(){
    return 10;
}

constexpr int func2(){
    return 20;
}

int main(){
    
    // array<int, func1()> arr1;
    array<int, func2()> arr2;

    return 0;
}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值