[C++]constexpr函数
constexpr函数(constexpr function)是指能用于常量表达式的函数。定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:函数的返回类型及所有形参的类型都得是字面值类型,而且函数体中必须有且只有一条return语句:
constexpr int new_sz() {return 42;} constexpr int foo=new_sz();//正确,foo是一个常量表达式
我们把new_sz定义成无参数的constexpr函数。因为编译器能在程序编译时验证new_sz函数返回的是常量表达式,所以可以用new_sz函数初始化constexpr类型的变量foo。
执行该初始化任务时,编译器把对constexpr函数的调用替换成其结果值。为了能在编译过程中随时离开,constexpr函数被隐式地指定为内联函数。
constexpr函数体内也可以包含其他语句,只要这些语句在运行时不执行任何操作就行。例如,constexpr函数中可以有空语句,类型别名以及using声明。
我们允许constexpr函数的返回值并非一个常量:
//如果arg是常量表达式,则scale(arg)也是常量表达式 constexpr size_t scale(size_t cnt) {return new_sz()*cnt;}
当scale的实参是常量表达式时,它的返回值也是常量表达式;反之则不然:
int arr[scale(2)]; //正确:scale(2)是常量表达式 int i=2; //i不是常量表达式 int a2[scale(i)]; //错误:scale(i)不是常量表达式
如上例所示,当给scale函数传入一个形如字面值2的常量表达式时,它的返回类型也是常量表达式。此时,编译器用相应的结果值替换对scale函数的调用。
如果我们用一个非常量表达式调用scale函数,比如int类型的i,则返回值是一个非常量表达式。当把scale函数用在需要常量表达式的上下文中时,由编译器负责检查函数的结果是否符合要求。如果结合恰好不是常量表达式,编译器将发出错误信息。
注:constexpr函数不一定返回常量表达式。
[C++]constexpr函数相关推荐
- constexpr函数
有点难理解权且记住,使用才会体会其中真正的差别. 常量表达式的概念:在编译期就可以计算出结果的表达式. 那么为什么要用常量表达式呢,用常量表达式会有什么好处: 1.允许一些计算只在编译时进行一次,而不 ...
- C++ 11 新特性: constexpr变量和constexpr函数
constexpr变量 字面值类型包括算术类型.引用.指针.枚举和数据成员都是字面值类型的聚合类. 聚合类的定义: 所有成员都是public的. 没有定义任何构造函数. 没有类内初始值 ...
- [C/C++] constexpr函数
常量表达式是指值不会改变并且在编译过程就能够得到计算结果的表达式.显然,字面值属于常量表达式,用常量表达式初始化的 const 对象也是常量表达式.如下: const int max_num = 20 ...
- 《C++ Primer 第五版》(第6.3~6.7节)——返回指向数组/函数的指针,函数重载,默认形参、inline函数和constexpr函数
1.返回指向数组/函数的指针 顾名思义,就是函数返回值为指向数组/函数的指针. 数组的性质:不能被拷贝,函数也不能返回数组.但可以返回数组指针/引用,声明一个返回数组指针的函数,有四种方式,一种是直接 ...
- C++中constexpr函数
1 简介 constexpr函数指的是在编译的时候就能得到其返回值的函数,也就是说编译器将constexpr函数直接转换成其返回值,因此,constexpr函数都是被隐式地定义为内联函数.使用cons ...
- constexpr 函数 “qCountLeadingZeroBits“ 不会生成常数表达式
Fix MSVC2017 compilation with enabled relaxed constexpr on 32-bit target qt 的bug ,按照下列地址修改源码 https: ...
- c++ 函数 -函数重载 -特殊用途的语言特性(默认实参,内联函数 ,constexpr ,assert,NDEBUG)
c++ 函数 -函数重载 -特殊用途的语言特性 文章目录 c++ 函数 -函数重载 -特殊用途的语言特性 函数重载 定义: 重载和const形参 const_cast 和重载 const_cast 重 ...
- C++11 constexpr使用
C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...
- C++Primer学习——函数
编译器能以任意顺序对形参进行求值 函数的返回类型不能是数组类型和函数类型. 函数开始时为形参分配内存,一旦函数结束,形参也就被销毁了. 如果弄成静态局部变量,那么回到程序终止结束时才被销毁. void ...
最新文章
- 如何利用 C# 爬取Gate.io交易所的公告!
- mysql查询数字比字符串快,与字符串相比,MySQL在where子句中使用数字更快吗?
- recovery的init.rc中挂载system
- [当人工智能遇上安全] 1.人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
- Qt学习之路(27): 渐变填充
- dede 验证码不显示 vdimgck.php,Dede后台验证码不显示解决方法详解(dedecms 5.7)
- CF204E-Little Elephant and Strings【广义SAM,线段树合并】
- Python实现GCS bucket断点续传功能,分块上传文件
- 基于CSE的微服务架构实践-Spring Boot技术栈选型
- EViews9.0程序安装及注意事项
- 桌球java_java实现一个桌球小游戏
- 制作一个货币汇率转换器
- 技术分享:逆向破解华为路由器第三部分
- 【Kafka】kafka日志收集平台搭建(二)
- java gui界面设计qq_Java swing界面开发(仿QQ登录界面)
- tif文件转为shp文件_ArcGIS栅格数据与矢量数据的转换
- caxa画图怎么倒角_CAXA电子图板如何倒角?CAXA电子图板倒角的绘制方法一览
- 杰理之GPIO汇总【篇】
- 值得收藏|关于2022年视频号经营解决方案,都在这里了
- 关于股息、增发、回购的个人看法
热门文章
- 自定义实现ProgressDialog样式的Dialog
- 关于@@IDENTITY、SCOPE_IDENTITY ()、IDENT_CURRENT ('tableName')
- 网站性能优化之HTTP请求过程简述!
- [转]Mogre 环境配置问题(Exception from HRESULT: 0x800736B1)
- webbench源码解析
- [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息
- 【计算机图形学课程】二.MFC鼠标响应函数模拟画图软件
- 【数据结构与算法】之深入解析“基本计算器”的求解思路与算法示例
- EduCoder 机器学习 逻辑回归
- Go语言生成区间随机数