constexpr限定符和常量表达式

2024-01-14 17:08

本文主要是介绍constexpr限定符和常量表达式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义

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

字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。

const int a = 4;	//字面值4是常量表达式,a 是一个const int对象,我们用常量表达式初始化它,因此a也是常量表达式
const string s = "str";	//同理s也是常量表达式

一个对象(或表达式)是不是常量表达式由它们的数据类型和初始值共同决定,例:

const int a = 20;	//初始值是常量表达式,因此const int对象a也是常量表达式
const int b = a + 1;	//a + 1是常量表达式,所以b是常量表达式
int c = 27;			//c 是一个int对象(变量),即使初始值是常量表达式
const int d = size();	//d不是常量表达式,因为其初始值size() 的返回值要到运行时才能得到。

constexpr变量

c++11标准允许声明constexpr类型的变量,声明为constexpr的变量一定是一个常量,而且必须使用常量表达式初始化。

constexpr int a = 20;	//20是常量表达式,a是一个常量
constexpr int b = a + 1;	//a + 1是常量表达式
constexpr int c = size();	//只有当size是一个constexpr函数(用constexpr修饰的函数在编译时就可以计算其结果了)时c才是常量

constexpr指针

也可用constexpr限定符声明指针,但仅对指针有效,与指针所指向的对象无关。

const int* p = nullptr;		//p是一个指向常量的指针,底层const:表示指针所指向的对象是一个常量
constexpr int* q = nullptr;	//q是一个指向整数的常量指针,顶层const:表示指针本身是个常量

constexpr指针既可以指向常量也可以指向一个非常量对象。

constexpr int* p = nullptr;	//np是一个指向常量的常量指针,其值为空
constexpr int i = 0;
int j = 4;
constexpr const int* q = &i;	//q是一个指向常量的常量指针,指向整型常量i
constexpr int* t = &j;			//t是常量指针,指向一个变量j

constexpr函数

constexpr 函数(constexpr function)是指能用于常量表达式的函数。

定义constexpr函数的方法与其他函数类似,不过要遵循几项约定:

①函数的返回类型及所有形参的类型都得是常量表达式。
②函数体中必须有且只有一条return语句。

constexpr int func() { return 42; } 	//func是一个无参的constexpr函数,程序在编译时验证该函数返回的是常量表达式
constexpr int a = func();			//a是一个常量表达式。编译器把对func的调用替换成其结果值。

因为要在编译过程中随时展开,constexpr函数被隐式地指定为内联函数。

常量表达式的适用场景

①指定数组的边界

int i = 99;
int a[i];		//错误,i不是一个常量表达式
constexpr int j = 99;
int b[j];		//正确,j是一个常量表达式

②指定非类型模板参数的值

template<unsigned size >
void test()
{//函数体
}test<i> f;	//显示传入模板实参,并声明一个函数对象f。错误,因为i不是常量表达式
test<j> f2;	//正确,j是一个常量表达式

③在类定义中,为一个static const的整数类型的数据成员提供一个初始化器

const int x = 5;
class X
{
static const int x_ = x;	//正确,x是一个常量表达式
};

这篇关于constexpr限定符和常量表达式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/605887

相关文章

Java中的Lambda表达式及其应用小结

《Java中的Lambda表达式及其应用小结》Java中的Lambda表达式是一项极具创新性的特性,它使得Java代码更加简洁和高效,尤其是在集合操作和并行处理方面,:本文主要介绍Java中的La... 目录前言1. 什么是Lambda表达式?2. Lambda表达式的基本语法例子1:最简单的Lambda表

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

SpringBoot @Scheduled Cron表达式使用方式

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有... 目录Cron 表达式详解1. 表达式格式‌2. 特殊字符解析3. 常用示例‌4. 重点规则5. 动态与复杂场景‌

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�