C++11--constexpr关键字

2023-11-13

关键字 constexpr 是在 C++11 中引入的,并在 C++14 中进行了改进。

作用

它是用于表示 constant(常量)表达式的。

        常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。

        使用常量表达式可以提高程序的执行效率,因为表达式只需要在编译阶段计算一次,节省了每次程序运行时都需要计算一次的时间。

声明为constexpr的变量一定是一个const变量,而且必须用常量表达式初始化:

const和constexpr的区别:

const 变量的初始化可以推迟到运行时进行。 constexpr 变量必须在编译时进行初始化。

constexpr修饰普通变量

修饰变量时,constexpr和const效果相同

使用 constexpr 修改普通变量时,变量必须经过初始化且初始值必须是一个常量表达式

constexpr修饰函数的返回值

被修饰的函数又称为“常量表达式函数”

注意:一个函数要想成为常量表达式函数,必须满足如下 4 个条件。

1.整个函数的函数体中,除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句。且return返回的表达式必须是常量表达式

错误用法:

2.函数必须有返回值,即不能出现constexpr void,可以出现constexpr int、constexpr float…

3.常量表达式函数在使用前,必须要有该函数的定义

constexpr修饰类的构造函数

对于 C++ 内置类型的数据,可以直接用 constexpr 修饰,但如果是自定义的数据类型(用 struct 或者 class 实现),直接用 constexpr 修饰是不行的。

        若要使用,正确的做法是在该类的内部添加一个常量构造函数

要求:该构造函数的函数体必须为空,且采用初始化列表的方式为各个成员赋值时,必须使用常量表达式。

用constexpr修饰成员函数、成员变量的方法和修饰普通函数、普通变量的方法相同

注意:C++11 标准中,不支持用 constexpr 修饰带有 virtual 的成员方法。

constexpr修饰模板函数

注意:C++11 标准规定,如果 constexpr 修饰的模板函数实例化结果不满足常量表达式函数的要求,则 constexpr 会被自动忽略,即该函数就等同于一个普通函数。

解析:

第21行,当模板函数中以自定义结构体 myType 类型进行实例化时,由于该结构体中没有定义常量表达式构造函数,所以实例化后的函数不是常量表达式函数,此时 constexpr 是无效的;

第24行,模板函数的类型 T 为 int 类型,实例化后的函数符合常量表达式函数的要求,所以该函数的返回值就是一个常量表达式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11--constexpr关键字 的相关文章

  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • clang 格式换行符在错误的位置

    给出以下代码行 get abc manager get platform status abc platform status sw update status fill update status actions allowed stat
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • JAVA微信公众号

    1 微信公众号介绍 账号分为服务号 订阅号 小程序 服务号和订阅号开发类似 但是申请服务号必须是企业 所以学习的话申请一个订阅号 测试账号即可 2 注册订阅号 第一步 访问 微信公众平台 点击立即注册按钮 第二步 注册类型页面选择订阅号 第
  • 【模型复杂度】torchsummary、torchstat和profile的使用

    模型的复杂度分析也是不同模型比较的重要指标 包括模型参数 浮点运算次数 Floating point operations FLOPs 内存占用和运存占用等 记录一下可以评价模型复杂度的方法 1 torchsummary torchsumm
  • C-结构体

    目录 结构体 定义结构体 第一种方式 定义的同时定义变量名 第三种方式 赋值和初始化 如何取出结构体成员 结构体变量 结构体指针作为函数参数进行传递 结构体运算 结构体 形成了一个新的数据类型 定义结构体 第一种方式 定义一个新的数据类型
  • GD32的项目源码从台式机拷贝到笔记本,烧录后串口数据异常

    目录 1 问题描述 2 故障排查 3 问题分析 4 问题总结 1 问题描述 最近一个项目 需要外场调试 将台式机的源代码拷贝到笔记本中 通过笔记本烧录程序到设备中 发现串口数据异常 重新使用台式机进行烧录 则设备输出正常 2 故障排查 由于
  • 系统架构设计高级技能 · Web架构设计

    现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in reality 点击进入系
  • webpack多页面改名的注意事项

    今天在进行项目打包时 由于甲方新规定了文件的名字 需要我们对原先的文件名进行重命名 这个需求是不是很简单 确实很简单 但是一不注意 就会给自己造成找错半天 原来的名字 进行改名 webpack同步更改如下 满心欢喜的以为自己改完了 然后np
  • Volley 源码解析

    1 功能介绍 1 1 Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架 在 Google I O 2013 大会上发布 名字由来 a burst or emission of many t
  • BeanUtil拷贝对象或集合时属性名不对应导致为空

    项目场景 源和目标实体类中的客户ID字段不对应 在使用Hutool的BeanUtil拷贝时字段为空 问题描述 源实体类属性 客户ID private String customerId 目标实体类属性 客户ID private String
  • jquery 小数计算保持精度,同时保留两位数

    点击打开链接 Num 3 Price 11 50 Number Price Num toFixed 2 34 50
  • pytorch 模型GPU推理时间探讨3——正确计算模型推理时间

    前言 上文说到 在统计pytorch模型的推理时间时发现每次的前几次推理耗时都非常多 而且在后面多次的推理中 其时间也呈现出很大的变化 后来经过调研 得知模型在GPU上推理时 需要对GPU进行一个warm up阶段 使得显卡达到工作状态 对
  • 串口拦截通信数据信息

    最近手头上有一个需要通信的外部设备 流量计 直接去看他的通信手册 里面没有例子 SO 刚开始看不太懂 官网上面有一个上位机软件 可以直接操作软件去设置参数 故 利用此上位机软件发送指令 然后在上位机和设备之间引出TX与RX 从而拦截二者串口
  • Qt类中使用函数指针

    使用函数指针有三步骤 1 声明一个函数指针 返回值类型和参数类型要与待指向的函数类型和参数一致 2 获取函数的地址 函数指针指向函数名 3 使用函数指针来调用所指向的函数 class Widget public QWidget public
  • CORE-ESP32C3

    目录 参考博文 源于网友oled eink aht10项目 源代码修改及复现说明 主要修改 显示效果 编辑硬件准备 软件版本 日志及soc下载工具 软件使用 接线说明 天气显示屏 硬件接线 温度采集 日期温度显示屏 正常初始化LOG 示例代
  • Spring Boot跨域问题简介

    什么是跨域问题 在Web开发中 跨域指的是在浏览器中访问一个不同于当前域名的资源 浏览器出于安全考虑 限制了这种跨域资源的访问 具体来说 当浏览器使用XMLHttpRequest或Fetch API发送跨域请求时 目标服务器必须在响应头中包
  • Python爬虫-11-response.text出现乱码的解决方案

    代码如下 这里是封装的一个下载url页面的方法 import requests def download page url user Agent None referer None print Downloading url headers
  • 前端xp单位和数值批量转换插件 编辑器正则匹配搜索

    因为要使手机端app自适应ipad端 所以要把项目中部分使用px的固定单位的改为相对单位 uniapp中规定了页面的宽度为750rpx 所以改起来还是很简单的 但是使用正则匹配修改px单位为rpx 编辑器可以按照正则匹配 但是因为没有运算功
  • 怎么禁用Windows Defender?

    如果你没有安装第三方杀毒软件 Windows10会自动激活其内置的Window Defender杀毒软件 虽然Windows Defender是Windows内置的 但是杀毒能力只能算比较平庸 并且在很多操作步骤和使用方法都不太符合用户的习
  • C++11Lambda表达式

    Lambda表达式 定义 可以理解为一个匿名函数 和函数一样 lambda表达式具有一个返回类型 一个参数列表和一个函数体 语法 capture list parameter list gt return type function bod
  • 使用tensorrt对keras-yolov3 模型进行低精度量化相关报错

    基本错误都是环境引起的 所以环境很重要 环境 python3 5 cuda10 0 cudnn 7 5 0 TensorRT 6 0 1 onnx 1 3 0 相关错误 错误1 NoneType object has no attribut
  • C++11--constexpr关键字

    关键字 constexpr 是在 C 11 中引入的 并在 C 14 中进行了改进 作用 它是用于表示 constant 常量 表达式的 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式 使用常量表达式可以提高程序的执行效率