首页 > 其他分享 >constexpr 和 const 的区别

constexpr 和 const 的区别

时间:2023-03-15 16:23:50浏览次数:36  
标签:const 函数 编译 int 区别 constexpr 常量

问题

constexpr 和 const 之间有什么区别?

回答

对变量来说,

const 表示的只是这个变量不可修改,但并未限定这个变量是编译期常量还是运行期常量;而 constexpr 只能是编译期常量。

const int kSize = 1; // 编译期常量

void func()
{
    const int kRandomNumber = get_a_random_number(); // 运行期常量
    ...
    ...
}

对于 kSize,你既可以用 const 修饰,也可以用 constexpr。但对于 kRandomNumber,你只能用 const。

对函数来说,

const 修饰的函数一般都是成员函数,用来表示这个函数不会对成员变量产生写操作,这点很好理解。

我们重点来看 constexpr。

我们可以把 constexpr 拆开来看就是 const expression,意即常量表达式。

constexpr int func(int i)
{
    return i + 1;
}

int main()
{
    int i             = 10;
    const int ci      = 10;
    constexpr int cei = 10;

    std::array<int, func(i)>   arr1; // 编译错误
    std::array<int, func(ci)>  arr2; // 没问题
    std::array<int, func(cei)> arr3; // 没问题
    std::array<int, func(10)>  arr4; // 没问题

    func(i); // 直接使用,也是没问题的

    return 0;
}

constexpr 修饰的函数,简单的来说,如果其传入的参数可以在编译时期计算出来,那么这个函数就会产生编译时期的值。但是,传入的参数如果不能在编译时期计算出来,那么 constexpr 修饰的函数就和普通函数一样了,比如上面代码直接调用了 func(i)。不过,我们不必因此而写两个版本,所以如果函数体适用于 constexpr 函数的条件,可以尽量加上 constexpr。

转载:constexpr 和 const 的区别

标签:const,函数,编译,int,区别,constexpr,常量
From: https://www.cnblogs.com/aplmmy49y/p/17218978.html

相关文章

  • A类,B类,AB类,D类音频放大器的区别
    根据放大电路的导电方式不同,音频功放电路按照模拟和数字两种类型进行分类,模拟音频功放通常有A类,B类,AB类, G类,H类 TD功放,数字电路功放分为D类,T类。 下文对以上的功放......
  • 某大厂面试题:说一说Java、Spring、Dubbo三者SPI机制的原理和区别
    大家好,我是三友~~今天来跟大家聊一聊Java、Spring、Dubbo三者SPI机制的原理和区别。其实我之前写过一篇类似的文章,但是这篇文章主要是剖析dubbo的SPI机制的源码,中间只是......
  • c++ noexcept与constexpr解析
    文章目录​​1.noexcept无需抛出异常​​​​2.constexpr静态编译关键字​​​​编译期常量​​​​类中constexpr​​1.noexcept无需抛出异常在C++中使用noexcept来标识......
  • mysql 关于导出表的几种方式的区别
    mysql关于导出表的几种方式的区别第一种select*fromtablename[wherecondition]intooutfile目标文件夹下的某文件mysql>select*fromhxjyintooutfile'C:/m......
  • Hashtable和Dictionary 的区别
    Hashtable和Dictionary都是.Net下的表示键值对的集合,那么我们在使用中该选择Hashtable还是Dictionary?下边我们看看他们之间的区别:1、Dictionary<K,V>在使用中是顺序存储的......
  • Swift 中的static 和 class 关键字使用及区别
    在Swift中,static和class关键字都可以用来修饰类的属性和方法,但它们之间有三个主要的区别:继承性:使用class修饰的属性和方法可以被子类重写,而使用static修饰的属......
  • Spring中的单例和多例的区别
    Spring中的单例和多例的区别https://blog.csdn.net/qq_41369135/article/details/1241034271,什么是单例和多例单例:所有请求用同一个对象来处理。通过单例模式,可以保证......
  • 什么是寄存器和存储器?寄存器与存储器有何区别?
    中央处理器CPU是单片机的核心,主要用来解译单片机指令以及处理计算机数据,内部结构大致可以分为控制单元、逻辑运算单元和存储单元三个部分,存储器和寄存器在计算机中起着不可......
  • var和let的区别
    变量声明let是ES6标准里的新增语法,var是老语法,今后尽量使用letlet和var的区别var缺点多,值得一提的有两点var会声明提升,导致语法混乱值得注意的是声明提升会受......
  • rails header 传参数开发环境正式环境区别
    rails开发环境api传递access_token参数  在controller用 request.headers["HTTP_ACCESS_TOKEN"]可获取到值。但是在生产环境却获取不到值了。原因是生产环境head......