常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。
使用constexpr,你可以创建一个编译时的函数:

constexpr int getConst()
{return 3;
}
void test07()
{int arr[getConst()] = { 0 };enum {e1 = getConst(),e2 };const int num = getConst();cout << sizeof(arr) / sizeof(arr[0]) << endl;cout << num << endl;
}

constexpr函数的限制

  1. 函数中只能有一条return语句
  2. 函数必须有返回值
  3. 在使用前必须定义
  4. return返回语句表达式中不能使用非常量表达式的函数、全局数据。只能是一个常量表达式
//函数中只能有一条return语句,在linux下编译失败,在vs2017上编译通过
constexpr int getconst()
{constexpr int i = 1;return i;
}
// 函数必须返回值,不能是void函数,因为函数必须有返回值,要不然该函数有什么用呢?
constexpr void getconst2()
{return;
}
constexpr int data2()
{// 一个constexpr函数,只允许包含一行可执行代码//但允许包含typedef、 using 指令、静态断言等。static_assert(1, "fail");return 100;
}
int a = 3;
constexpr int data3()
{return a;// return返回语句表达式中不能使用非常量表达式的函数、全局数据
}int main(int argc, char ** argv)
{constexpr int func();//函数声明,定义放在main后面constexpr int c = func();// 无法通过编译,在使用前必须已经有定义system("pause");return 0;
}

常量表达式的构造函数有以下限制

  1. 函数体必须为空
  2. 初始化列表只能由常量表达式来赋值
struct Date
{constexpr Date(int y, int m, int d): year(y), month(m), day(d) {}constexpr int GetYear() { return year; }constexpr int GetMonth() { return month; }constexpr int GetDay() { return day; }private:int year;int month;int day;
};int main()
{constexpr Date PRCfound {1949, 10, 1};// 必须是常量表达式constexpr int foundmonth = PRCfound.GetMonth();// vs2017下失败了,linux下成功cout << foundmonth << endl;  // 10return 0;
}

C++11:常量表达式相关推荐

  1. c++11 常量表达式

    c++11 常量表达式 #define _CRT_SECURE_NO_WARNINGS#include <iostream> #include <string> #includ ...

  2. [C++11]常量表达式函数

    constexpr修饰函数. 普通函数/类成员函数. 1.函数必须要有返回值,并且return返回的表达式必须是常量表达式. 代码如下: #include <iostream> using ...

  3. C++11之常量表达式(const与constexpr的区别)

    系列文章 C++11之正则表达式(regex_match.regex_search.regex_replace) C++11之线程库(Thread.Mutex.atomic.lock_guard.同步 ...

  4. c语言 常量表达式,C++11 constexpr:验证是否为常量表达式(长篇神文)

    constexpr 是 C++ 11 标准新引入的关键字,不过在讲解其具体用法和功能之前,读者需要先搞清楚 C++ 常量表达式的含义. 所谓常量表达式,指的就是由多个(≥1)常量组成的表达式.换句话说 ...

  5. C++11 nullptr与常量表达式constexpr记录

    1.nullptr (1) nullptr是一个关键字,而nullptr_t是一个类型 typedef decltype(nullptr) nullptr_t 使用nullptr_t类型必须包含#in ...

  6. 常量表达式(constexpr)

    首先,常量表达式的概念:在编译期就可以计算出结果的表达式 那么为什么要用常量表达式呢,用常量表达式会有什么好处: 1.允许一些计算只在编译时进行一次,而不是每次程序运行时: 2.编译器可以进行尺度更大 ...

  7. c++nullptr(空指针常量)、constexpr(常量表达式)

    总述     又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...

  8. C++常量表达式函数

    目录 常量表达式的功能 constexpr关键字和用户定义型别 constexpr对象 constexpr函数 constexpr模版 整数字面值即为常量表达式(constant expression ...

  9. (P3-P4)constexpr修饰常量表达式和常量表达式函数

    文章目录 1. const 2.constexpr 3.常量表达式函数 1. const 在 C++11 之前只有 const 关键字,从功能上来说这个关键字有双重语义:变量只读,修饰常量 eg: v ...

最新文章

  1. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)
  2. python自学攻略-Python自学攻略
  3. 使用函数PIVOT现实数据行转列
  4. 从一个帖子看部分大学生的学习心态
  5. Java基本流程控制语句
  6. crossdomain.xml配置不当的利用和解决办法
  7. Linux logo和屏幕光标
  8. torch.view(), squeeze, unsqueeze
  9. java response cookie_JavaWeb部分 (Response Cookie)
  10. Linux命令--- /dev/null和/dev/tty
  11. express : 无法将“express”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。express: command not found
  12. 【iCore4 双核心板_FPGA】例程一:GPIO输出实验——点亮LED
  13. php data取年月,PHP-date函数 年、月、日参数详解
  14. java ocr linux_linux (centos7)上装Tesseract-OCR最新版本(5.0)
  15. 大型企业通用ERP进销存源码 ASP.Net开发系统源码
  16. Python爬取实习僧职位信息
  17. classes是什么意思怎么读_class是什么意思_class的翻译_音标_读音_用法_例句_爱词霸在线词典...
  18. 层次softmax (hierarchical softmax)理解
  19. MATLAB运用all函数剔除0元素
  20. Java多线程游戏实例分享2-雷火(手把手教你做个超炫酷的星际争霸)

热门文章

  1. Unitimes三周年完美落幕,快来领取您的奖品吧!
  2. 使用python做tf-idf算法实践
  3. ES6新增数据类型:Symbol
  4. 三点式LC正弦波振荡器电路详解
  5. Android11.0(R) MTK6771 user版本关闭 SELinux
  6. hive 分区表select全部数据_hive分区表
  7. AJAX RSS Reader Step by Step Tutorial
  8. 动态库(.so)的制作
  9. Python读取docx文档的内容
  10. template标签用法总结