constexpr 指定符(C++11 起)

发布时间:2020-07-01 16:59:09 作者:myhaspl
来源:网络 阅读:176

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;
}```

推荐阅读:
  1. c++11如何实现闭包
  2. C++11中如何使用using

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ constexpr c++11

上一篇:解决python注释报错的方法

下一篇:怎么用java判断文件是否存在

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》