c++新特性实验(3)声明与定义:constexpr
1.作用
constexpr
声明一个函数或变量,它的值可以在编译时出现在常量表达式之中。
2.constexpr 变量要求
- 其类型必须是 字面类型 (LiteralType) 。
- 它必须被立即初始化
- 其初始化的全表达式,包括所有隐式转换、构造函数调用等,都必须是常量表达式.
3.constexpr 普通函数要求
-
- 必须非虚.(C++20 前)
- 返回类型必须是字面类型 (LiteralType)
- 其每个参数都必须是字面类型 (LiteralType)
- 至少存在一组实参值。
- 函数体必须不含 (C++14 后)
- asm 声明
- goto 语句
- 拥有除
case
和default
之外的标号的语句 - try 块 (C++20 前)
- 非字面类型的变量定义
- 静态或线程存储期变量的定义
- 不进行初始化的变量定义。
-
- (=default; 或 =delete; 的函数体不含任何上述内容。)
- 函数体必须被弃置或预置,或只含有下列内容:(C++14 前)
-
- 空语句(仅分号)
- static_assert 声明
- 不定义类或枚举的 typedef 声明及别名声明
- using 声明
- using 指令
- 恰好一条 return 语句。
4.constexpr构造函数的要求
- 其每个参数都必须是字面类型 (LiteralType)
- 不能有虚继承
- 该构造函数必须无函数 try 块
- 构造函数体必须满足 constexpr 函数体的制约
- 对于 class 或 struct 的构造函数,每个子对象和每个非变体非 static 数据成员必须被初始化。若类是联合体式的类,对于其每个非空匿名联合体成员,必须恰好有一个变体成员被初始化
- 对于非空 union 的构造函数,恰好有一个非静态数据成员被初始化
- 每个被选用于初始化非静态成员和基类的构造函数必须是 constexpr 构造函数。
- 构造函数体必须被弃置或预置,或只含有下列内容:
-
- 空语句
- static_assert 声明
- 不定义类或枚举的 typedef 声明及别名声明
- using 声明
- using 指令
5.constexpr if
- 以
if constexpr
开始的语句被称为constexpr if 语句。 - 在 constexpr if (条件)语句中,条件的值必须是可转换到
bool
类型的常量表达式。 - 若其值为
true
,则抛弃 false分支语句(若存在),否则抛弃true分支语句。
6.示例
#include <cstdlib>
#include <cstdio>
#include <cstdint>
#include <vector> static void
fun(){
//printf("%s called \n",__func__);
} constexpr int
getCount(){
int a = ;
int b = ;
a *= b;
//printf("%s called \n",__func__); //error,C++11 constexpr 函数必须把一切放在单条 return 语句中,C++14 无此要求
//fun(); //error,fun 不是constexpr
return * ;
} class person{
protected:
virtual void getName();
}; class student : /*virtual*/ public person{ // 不能有虚继承
private:
constexpr static int LEN = ;
char16_t name[getCount()]; //getCount() 是constexpr函数。
uint8_t age;
public:
constexpr student():name(u"hello"),age(getCount()){
typedef int INT;
using namespace std;
enum Color{
Red,Green,Blue,
};
Color color = (Color);
}
student(int ){
}
/*
virtual constexpr int getAge(){ //error,constexpr成员函数不能是virtual的。
return 100;
}
*/
virtual void getName(){ }
friend constexpr char16_t* getName(student &,int max = );
}; constexpr char16_t*
getName(student &s,int max){
using namespace std;
typedef class student Student;
//static int value = 100; //error,不能有静态变量。
//vector<int> vec; //error,不是常量表达式。
if(s.age < ){
//goto END; //error,不能有goto
} //__asm__("movl %eax, %ebx\n\t"); //error,不能有汇编语句。 /*
try{ //error,不能有try...catch语句。
++s.age;
}catch(const exception &e){
printf("exception \n");
}
*/ switch(s.age){
case : return u"ek"; /* U"0" */; // U是char32_t,u是char16_t
case : return u"fel";
default : return u"Default";
}
END:
return u"error";
} int
main(int argc,char *argv[]){ if constexpr(getCount() > ){
#line 1024 "test.cpp"
}
printf("file = %s,line = %d\n",__FILE__,__LINE__);
return ;
}
c++新特性实验(3)声明与定义:constexpr的更多相关文章
- c++新特性实验(5)声明与定义:属性列表(C++11 起)
1.初识属性 1.1 实验A: noreturn 属性 [[ noreturn ]] static void thread1(void *data){ cout << "nore ...
- c++新特性实验(4)声明与定义:右值引用(C++11)
1.作用 c++11以前,临时对象.字面常量一般情况下不可以再次访问,也不可以修改.右值引用可以解决这个问题. 1.1 实验A #include <iostream> using name ...
- MySQL8.0新特性实验1
Server层,选项持久化 mysql> show variables like '%max_connections%';+------------------------+-------+| ...
- c++新特性实验(1)预处理
1.参考资料 1.1 C++ C++17 标准文档(正式) : https://www.iso.org/standard/68564.html C++ 标准文档(草案) : ht ...
- c++新特性实验(2)类型特性
1. 基本类型 1.1 增加 long long long long int signed long long signed long long int unsigned long long unsi ...
- C++ 11 新特性:函数声明auto
1.概览 1.1 函数名中的箭头,用来表明函数的return type,其使用在函数的返回类型需要通过模板参数进行推导,使用在decltype()和declval()不方便的场景 2.正文 c++ 中 ...
- C++11新特性实验
#include <iostream> #include <vector> #include <map> #include <string> #incl ...
- php5.3到php7.0.x新特性介绍
<?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...
- PHP 7 新特性
PHP 7 新特性 标量类型声明 PHP 7 中的函数的形参类型声明可以是标量了.在 PHP 5 中只能是类名.接口.array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数) ...
随机推荐
- virtualbox导入winXP系统OVA文件重启
1,开启虚拟机 2,按f8进入安全模式,然后修改注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Processor HKEY_LOC ...
- 浅谈web应用的高可用
1.熟悉几个组件 1.1.apache —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安全 ...
- [JZOJ3187]【GDOI2013模拟8】的士
题目 描述 题目大意 在一个数轴上,有些人要从某个点到达另一个点. 出租车从最左端出发,将所有人送到它们的目的地,最终到达最右边的点. 出租车只能做一个乘客,并且可以在图中将乘客丢下. 问最短时间. ...
- JVM的内存空间
一.JVM运行起来,就会给内存划分空间,这块空间成为运行时数据区.运行时数据区主要划分为以下几部分内容: 1.栈 每一个线程运行起来的都会对应一个栈(线程栈),栈中的数据是该线程独有的,不会产生资源共 ...
- 基于知识图谱的APT组织追踪治理
高级持续性威胁(APT)正日益成为针对政府和企业重要资产的不可忽视的网络空间重大威胁.由于APT攻击往往具有明确的攻击意图,并且其攻击手段具备极高的隐蔽性和潜伏性,传统的网络检测手段通常无法有效对其进 ...
- git difff
Generate patch through git diff http://stackoverflow.com/questions/1191282/how-to-see-the-changes-be ...
- 密码学笔记(5)——Rabin密码体制和语义安全性
一.Rabin密码体制 Rabin密码体制是RSA密码体制的一种,假定模数$n=pq$不能被分解,该类体制对于选择明文攻击是计算安全的.因此,Rabin密码体制提供了一个可证明安全的密码体制的例子:假 ...
- php构造方法(函数)基础
什么是构造函数呢?在回答这个问题之前,我们来看一个需求:我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就指定这个对象的年龄和姓名,该怎 ...
- 黑裙辉DS918+安装错误码21,安装教程 重装需要重新制作启动盘
不然报错误码21
- CentOS6安装docker、docker-compose、docker-enter
一.安装docker 1.查看CentOS内核版本 uname -r 2.安装Fedora的EPEL源 yum install http://ftp.riken.jp/Linux/fedora/epe ...