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

相关文章

Python19 lambda表达式

在 Python 中,lambda 表达式是一个小型匿名函数,通常用于实现简单、单行的函数。lambda 函数可以接受任意数量的参数,但只能有一个表达式。 基本语法: lambda arguments: expression 这里,arguments 是传递给 lambda 的参数,expression 是关于这些参数的表达式,它的计算结果就是 lambda 函数的返回值。 使用

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

Java常量总结

Java常量总结 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java中,常量是指在程序运行过程中其值不能被修改的变量。常量可以是基本数据类型或引用类型,一旦被赋值,其值将在整个程序生命周期内保持不变。 2. 常量的分类 Java中的常量可以分为两种类型: 字面常量(Literal Constants):直接出现在程

Android Apk瘦身方案1——R.java文件常量内联

R.java 文件结构 R.java 是自动生成的,它包含了应用内所有资源的名称到数值的映射关系。先创建一个最简单的工程,看看 R.java 文件的内容: R文件生成的目录为app/build/generated/not_namespaced_r_class_sources/xxxxxDebug/processXXXXDebugResources/r/com/xxx/xxx/R.java

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信号函数的方法找槽函数的方法 自定义信号和槽 lambda表达式练习MenuTool Qt creator 快捷键 运行:ctrl

jsp脚本、jsp声明、jsp表达式

<strong><span style="font-size:14px;">jsp脚本 </span></strong><%out.println("这句将输出在浏览器里面,是jsp脚本"); %><%System.out.println("这句将输出在控制台console而不会在浏览器里面输出且查看源代码这一句也是隐藏的"); %> jsp声明变量,方法的格式<%! xxx;%> 举

SQL Plu计算算数表达式及SQL Plus下清屏快捷键

用PL/SQL数据库语言计算sqrt(58+25*3+(19-9)^2)的值 SQL Plus下清屏快捷键是host cls或者 clear screen PL/SQL计算乘方是2个*号:

js函数声明与函数表达式的区别

在JavaScript中,函数可以通过函数声明和函数表达式两种方式进行定义。 函数声明是通过关键字function和函数名来定义的,例如: function add(a, b) {return a + b;} 函数表达式是将函数赋值给一个变量或者存储在一个对象的属性中,例如: var subtract = function(a, b) {return a - b;}; 两

学懂C#编程:常用高级技术——学会Lambda表达式的应用(二)

上一篇介绍了Lambda基础的知识,接着我们通过讲解Lambda的几种应用场景来彻底学懂Lambda在编程中的应用。 Lambda表达式在C#中非常灵活,可以用在多种场合。以下是一些Lambda表达式示例,帮助你更全面地理解其用途: 1. 数组过滤(使用Where) int[] numbers = { 1, 2, 3, 4, 5, 6 };var evenNumbers = numbers

使用 C++11 Lambda 表达式在 Qt 中连接信号与槽

在 Qt 使用 C++11 引入的 lambda 表达式来简化信号与槽的连接已经成为一种不错的选择。本文将通过一个简单的例子来展示如何使用 lambda 表达式来连接 QAction 的信号与槽。 传统的连接方式 首先,看看传统的连接方式: QAction* action = foo->addAction(tr("Some Action"));connect(action, SIGNAL(