c++11 常量表达式
c++11 常量表达式
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vector> #include <map> /** * 常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。 * 这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时都计算。 */ /* constexpr函数的限制: 函数中只能有一个return语句(有极少特例) 函数必须返回值(不能是void函数) 在使用前必须已有定义 return返回语句表达式中不能使用非常量表达式的函数、全局数据,且必须是一个常量表达式 */ constexpr int GetConst() { return 3; } //err,函数中只能有一个return语句 constexpr int data() { constexpr int i = 1; return i; } constexpr int data2() { //一个constexpr函数,只允许包含一行可执行代码 //但允许包含typedef、 using 指令、静态断言等。 static_assert(1, "fail"); return 100; } int a = 3; constexpr int data3() { return a;//err, return返回语句表达式中不能使用非常量表达式的函数、全局数据 } /* 常量表达式的构造函数有以下限制: 函数体必须为空 初始化列表只能由常量表达式来赋值 */ 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; }; void mytest() { int arr[GetConst()] = {0}; enum {e1 = GetConst(), e2}; constexpr int num = GetConst(); constexpr int func(); //函数声明,定义放在该函数后面 constexpr int c = func(); //err, 无法通过编译, 在使用前必须已有定义 constexpr Date PRCfound {1949, 10, 1}; constexpr int foundmonth = PRCfound.GetMonth(); std::cout << foundmonth << std::endl; // 10 return; } constexpr int func() { return 1; } int main() { mytest(); system("pause"); return 0; }