为了账号安全,请及时绑定邮箱和手机立即绑定

constexpr 指定符(C++11 起)

标签:
C++


constexpr 指定符声明可以在编译时求得函数或变量的值。然后这些变量和函数(若给定了合适的函数参数)可用于仅允许编译时常量表达式之处。用于对象或非静态成员函数 (C++14 前)声明的 constexpr 指定符隐含 const 。用于函数声明的 constexpr 指定符或 static 成员变量 (C++17 起)隐含 inline 。

constexpr 变量必须满足下列要求:

其类型必须是字面类型 (LiteralType) 。

它必须被立即初始化

其初始化的完整表达式,包括所有隐式转换、构造函数调用等,都必须是常量表达式

constexpr 函数必须满足下列要求:

它必须非虚

(C++20 前)

其返回类型必须是字面类型 (LiteralType)

其每个参数都必须是字面类型 (LiteralType)

至少存在一组参数值,使得函数的一个调用能为被求值的核心常量表达式的子表达式(对于构造函数为足以用于常量初始化器) (C++14 起)。不要求对这点的诊断。

函数体必须是被删除或被默认化,或只含有下列内容:

空语句(平凡分号)

static_assert 声明

不定义类或枚举的 typedef 声明及别名声明

using 声明

using 指令

恰好一条 return 语句。

(C++14 前)

函数体必须是被删除或被默认化,或含有下列内容外的任何语句:

asm 声明

goto 语句

拥有异于 case 和 default 标号的语句

try 块

非字面类型的变量定义

静态或线程存储期变量的定义

不进行初始化的变量定义。

(C++14 起)

constexpr 构造函数必须满足下列要求:

其每个参数都必须是字面类型 (LiteralType) 。

该类不能有虚基类

该构造函数不可有函数 try 块

构造函数体必须被删除或被默认化或只含有下列内容:

空语句

static_assert 声明

不定义类或枚举的 typedef 声明及别名声明

using 声明

using 指令

(C++14 前)

构造函数体的复合语句必须满足 constexpr 函数体的限制

(C++14 起)

对于 class 或 struct 的构造函数,每个子对象和每个非变体非 static 数据成员必须被初始化。若类是类联合体类,对于其每个非空匿名联合体成员,必须恰好有一个变体成员被初始化

对于非空 union 的构造函数,恰好有一个非 static 数据成员被初始化

每个被选作初始化非 static 成员和基类的构造函数必须是 constexpr 构造函数。

对于 constexpr 函数模板和类模板的 constexpr 函数成员,必须至少有一个特化满足上述要求。其他特化仍被认为是 constexpr ,尽管常量表达式中不能出现这种函数的调用。

```c++

//

// main.cpp

//

//

// Created by myhaspl on 2018/10/24.

// myhaspl@myhaspl.com.

//

#include <iostream>

using namespace std;

int bar(){return 0;}

constexpr int foo(int a)

{

if (a <=0 )

return bar();

else

return 1;

}

int main()

{

int a1[2]={0,1};

cout<<a1[foo(5)]<<endl;

cout<<a1[foo(-1)]<<endl;

}```

©著作权归作者所有:来自51CTO博客作者myhaspl的原创作品,如需转载,请注明出处,否则将追究法律责任

c++constexprc++11软件设计与架构


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消