关键字 constexpr 是C++11中引入的关键字,声明为 constexpr类型的变量 ,编译器会验证该变量的值是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化:

constexpr int mf = 0; // 0 是常量表达式
constexpr int limit = mf + 1; // mf + 1 是常量表达式
constexpr int sz = size(); // 只有当 size() 是一个constexpr函数时才是一条正确的声明语句

constexpr 函数 是在使用需要它的代码时,可以在编译时计算其返回值的函数。当其参数为 constexpr 值并且在编译时使用代码需要返回值时(例如,初始化一个 constexpr 变量或提供一个非类型模板参数),它会生成编译时常量。使用非constexpr 参数调用时,或编译时不需要其值时,它将与正则函数一样,在运行时生成一个值。
const 和 constexpr 变量之间的主要区别在于:const 变量的初始化可以延迟到运行时,而 constexpr 变量必须在编译时进行初始化。所有 constexpr 变量均为常量,因此必须使用常量表达式初始化。

#include <iostream>
using namespace std;
template<typename T, int N>
constexpr int length(const T(&ary)[N])//检查数组长度
    return N;
constexpr int fac(int n)//递归
    return n == 1 ? 1 : n*fac(n - 1);
int main(int argc, char const *argv[]) {
    //constexpr int f5 = fac(5);
     const int nums[]{ 1, 2, 3, 4 };
    cout<<fac(5)<<endl;
    cout<<length(nums)<<endl;
    return 0;
这是 char_view 的自述文件 - 具有编译时处理的不可变字符串视图类,支持 C++ 字符串文字、std::strings 和 char 缓冲区。 库目前作为仅标头解决方案实施。
软件是在 BSD 许可下发布的,详细信息请参见 license.txt。
以 C++ 方式处理轻量级字符串文字(使用 std::string 中的函数)
 支持编译时属性(长度、散列)和搜索方法(查找、包含、等于等)
 在 switch 语句中支持字符串
允许编译时字符串函数计算: 
  using namespace sbt;
  // check if string has prefix "std::"
  constexpr bool HasStdPrefix(const char_view &value) {
      return value.starts_wi
                                    constexpr Murmur3A哈希
这是constexpr(C ++ 14)实现或MurMur3A,可以使用clang或gcc进行编译。 有关更多详细信息,请参阅我关于此库的。
这是仅标头的库。 包括头文件constexpr_murmur3.h并调用函数ce_mm3::mm3_x86_32 。
返回的值真的是编译时常量吗?
 是的。 以下代码将无法编译:
 using ce_mm3::mm3_x86_32;
template < int>
struct printer
    printer () { std::cout << N> p;
该代码是否符合标准格式?
 老实说,我不确定。 我没有使用任何reinterpret_ca
 叮当3.5
 ##用法###元组
shiro::tuple 是一个元组实用程序,它具有像 std::tuple 这样的接口。 假设用于复杂的元编程等。它的操作的递归深度受到限制,因此它可以处理很多参数。 
# include < shiro>
constexpr auto ct = shiro::make_tuple( 1 , ' a ' , true , /* arguments... */ , 0 );
static_assert (shiro::get< 0>(ct) == 1, "");
static_assert (shiro::get< 1>(ct) == 'a', "");
static_assert (shiro::get< 2>(ct) == true
constexpr int mf = 20;  //20是常量表达式
constexpr int limit = mf + 1; // mf + 1是常量表达式
constexpr int sz = size(); //之后当siz...
                                    C中的静态类成员由于标准的语言对我造成了一些混乱:9.4.2 Static data members [class.static.data]The declaration of a static data member in its class definition is not a definition…然而,一个constexpr需要被初始化(AFAIK,在标准中找不到引号)(例如在类定义中)...
                                    x:y),将其优化成6 .由于此表达式不再需要在运行时计算,因此我们的程序将运行得更快。但是函数在程序中调用需要入栈出栈,函数调用次数一多,程序的性能就会下降。:以非常量表达式初始化的const变量都是运行时常量,运行时常量在运行时之前其初始值都是未知的。在上述例子中,cout函数中存在表达式不太理想,如果表达式是一个命名函数会更好。注意:constexpr修饰的变量初始化的值如果不是常量表达式,编译时会报错。:编译器可以在编译时计算常量表达式,因此我们的程序将运行得更快。
                                    元编程(metaprogramming)是一个典型的复合词,他由前缀 meta- 和词根 programming 复合而成,有“对一个程序进行编程”的意思。换句话说,编译器先编译你的代码,得到一份新的代码,然后再编译新的代码来解决问题。
模板元编程技术,即把一些可以在编译时完成的求值计算,通过模板特化的技术绑定到具体的实例化代码上,从而减少不必要的代码量,提升代码的运行效率。
一、C++的元编程
1.1 为什么要元编程呢?
前面我们知道了什么是元编程,那么为什么要有这种编写技巧呢?
无外乎两点:减少重复的代
                                    const修饰常量,但是const并未区分编译时常量和运行时常量,而constexpr则只能是编译时常量,在C++11中提出。
这篇文章,将详细讲解constexpr。
一、常量表达式
常量表达式(const expression):指值不会改变并且在编译阶段过程就能得到计算结果的表达式。
以下两种是常量表达式:
const int maxSize = 10;
const int limit = maxSize + 1;
以下两种不是常量表达式:
int staff_size = 27;
cons..
                                    C++:constexpr简介语法参数返回值constexpr 变量constexpr 函数示例
关键字 constexpr 是在 c + + 11 中引入的,并在 c + + 14 中得到改进。 它表示* const ant 表达式*。 与类似 const ,可将其应用于变量:当任何代码尝试将值进行 mod 时,将引发编译器错误 if 。 与不同 constconstexpr 还可以应用于函数和类 const ructors。 constexpr 指示值或返回值为 ant,并在 const 编
                                    4.return返回语句表达式中不能使用非常量表达式的函数、 全局数据, 且。1. 函数体只有单一的return返回语句。2.函数必须返回值(不能是void函数)2. 可以使用多个return。1. 可以使用局部变量和循环。3.在使用前必须已有定义。必须是一个常量表达式。
                                    常量表达式必须在编译期间计算出它的值并且 它的值不可以被改变。
常量表达式主要是允许一些计算发生在编译时,即发生在代码编译而不是运行的时候。这是很大的优化:假如有些事情可以在编译时做,它将只做一次,而不是每次程序运行时。需要计算一个编译时已知的常量。
	constexpr int mf = 20;            // 常量表达式
	constexpr int limit = mf + 1;...