C++:constexpr 和 const 的区别

2023-09-18 19:10:07

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)

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

更多推荐

01. pring Cloud微服务系列之 包版本号约定

SpringCloud微服务系列文章,点击上方合集↑1.Java8目前市场上最常用的是Java8,而Java17则代表着未来的发展趋势。虽然SpringBoot3已经发布,但它要求最低版本为Java17。然而,考虑到目前很多开发工具库还没有完全适配Java17,因此在生产环境中使用可能会遇到一些问题和不兼容的情况。所以

U盘有病毒插上电脑会感染吗?了解下U盘的病毒传播机制

U盘作为一种常见的移动存储设备,我们会经常使用它来传输和存储重要的文件。然而,有时可能会遇到文件被当作病毒误删除的情况,这给我们带来了不便和焦虑。好在,这里将向您介绍一些简单而有效的方法,帮助您恢复被误删除的U盘文件,并探讨U盘的病毒传播机制,解答“U盘有病毒插上电脑会感染吗”的疑惑。▌案例分享“我安装了多个防病毒软件

python+nodejs+php+springboot+vue校园在线拍卖竞拍系统

要想实现在线拍卖系统的各项功能,需要后台数据库的大力支持。管理员验证注册信息,收集的用户信息,并由此分析得出的关联信息等大量的数据都由数据库管理。用户功能模块5.1首页用户登录进入在线拍卖系统可以查看首页、个人中心、历史竞拍管理、竞拍订单管理、留言板管理等内容,如图5.2历史竞拍管理在历史竞拍管理页面可以查看商品名称;

SpringBoot详解

文章目录SpringBoot的特点Spring,SpringBoot的区别SpringBoot常用注解标签SpringBoot概述SpringBoot简单Demo搭建读取配置文件的内容SpringBoot自动配置Condition自定义beanSpringBoot常用注解原理@EnableAutoConfigurati

Universal Robot (UR3)与USB摄像头和电磁夹持器结合的ROS拾取和放置硬件实施详细教程:从连接到实践

第一部分:连接UniversalRobot(UR3)到PC1.将UniversalRobot(UR3)连接到PC(Ubuntu16.04)在实现机器人的自动化任务之前,首先需要确保机器人与计算机之间的连接是稳定的。在这一部分,我们将详细介绍如何将UniversalRobot(UR3)连接到运行Ubuntu16.04的P

Spring编程常见错误50例-Spring Bean依赖注入常见错误(下)

@Value没有注入预期的值问题对于@Value可以装配多种类型的数据:装配对象:@Value("#{student}")privateStudentstudent;@BeanpublicStudentstudent(){Studentstudent=createStudent(1,"xie");returnstude

关键节点与邻居搜索:K-Core算法对比K-Hop算法的效能较量

文章首发地址K-Core算法K-Core算法是一种网络分析算法,用于发现网络中的核心节点。核心节点是指在网络中具有重要影响力的节点,它们连接着大量其他节点,是网络中的重要信息传播和控制中心。K-Core算法通过逐步删除网络中度小于K的节点,直到网络中不存在度小于K的节点为止,然后得到的网络即为K-Core网络。K-Co

有效的括号(栈的高频面试题)

一、题目描述题目连接:有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。输出需求示例1:输入:s="()"输出:true示例2:输入:s="()[

I/O扩展器IC

一、前言由于单片机资源不足,第一次使用IO扩展器,顺便记录下来使用心得,网上查询资料很少,使用的人不多,基本都得照着手册去手搓,搞底层难啊.需要扩展的IO需求不是很复杂,也不是用来在驱动总线信号,就是扩展为IO,有输入和输出控制即可,之前总用移位寄存器74HC595去扩展IO输出控制,但是需要输入的时候,还是得用专用的

流媒体弱网优化之路(机器学习应用)——了解我们的网络模型

流媒体弱网优化之路(机器学习应用)——了解我们的网络模型——我正在的github给大家开发一个用于做实验的项目——github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置,提供全面的可视化算法观察能力。欢迎大家使用——文

医疗革命的关键推手,看AIGC弥合医疗差距的未来之路

随着科技的飞速进步,医疗水平在过去几十年里取得了巨大的突破。这些科技创新不仅改变了我们对健康和医疗的认知,也深刻地塑造了社会的现状。其中,人工智能作为医疗领域的一项前沿技术,正以前所未有的方式影响着我们的生活。它不仅提高了医疗水平,还为社会带来了全新的挑战和机遇。但医疗差距始终一直存在,不同地区和人群之间医疗服务和资源

热文推荐