C++:constexpr
简介
关键字 constexpr 是在 c + + 11 中引入的,并在 c + + 14 中得到改进。 它表示* const ant 表达式*。 与类似 const ,可将其应用于变量:当任何代码尝试将值进行 mod 时,将引发编译器错误 if 。 与不同 const , constexpr 还可以应用于函数和类 const ructors。 constexpr 指示值或返回值为 ant,并在 const 编译时计算(如果可能)。
constexpr 整数值可用于需要整数的任何位置 const ,例如模板参数和数组声明中的。 在编译时(而非运行时)计算某个值时,它可帮助您的程序运行速度更快,使用更少的内存。
为了限制编译时 ant 计算的复杂性 const ,以及它们对编译时间的潜在影响,c + + 14 标准要求 ant 表达式中的类型为 const 文本类型。
语法
constexpr文本类型 ident if ier = * const * ;
**constexpr*文本类型 ident if ier { * const ant-expression } ;
**constexpr文本类型 ident if ier ** ( 参数 **) ** ;
**constexprctor ** ( 参数 **) ** ;
参数
化
一个或多个参数,每个参数必须是文本类型,并且本身必须是 const ant 表达式。
返回值
constexpr 变量或函数必须返回文本类型。
constexpr 变量
和变量的主要 d if f) const constexpr 是在 const 运行时,可以将变量的初始化推迟。 constexpr 变量必须在编译时进行初始化。 所有 constexpr 变量都是 const 。
constexpr 如果变量具有文本类型并已初始化,则可以使用声明该变量。 如果初始化 for 由 ructor 按 med-v 进行 const ,则 const 必须将 ructor 声明为 constexpr 。
constexpr 当同时满足这两个条件时,可以声明引用:引用的对象由 const ant 表达式进行初始化,并且在初始化期间调用的任何隐式转换也是 const ant 表达式。
变量或函数的所有声明都 constexpr 必须具有 constexpr 规范 if ier。
constexpr float x = 42.0;
constexpr float y{
108};
constexpr float z = exp(5, 3);
constexpr int i; // Error! Not initialized
int j = 0;
constexpr int k = j + 1; //Error! j not a constant expression
constexpr 函数
constexpr 当使用代码需要函数时,该函数的返回值可在编译时。 使用代码要求在编译时返回值以初始化 constexpr 变量,或提供一个非类型模板参数。 如果其参数为 constexpr 值, constexpr 函数将生成编译时 const ant。 使用非参数调用时 constexpr ,或在编译时不需要其值时,它会在运行时生成一个值,如常规函数。 (这种双重行为使您不必编写 constexpr 同一函数的和非 constexpr 版本。 )
constexpr 函数或 const ructor 是隐式的 inline 。
以下规则适用于 constexpr 函数:
constexpr 函数必须接受并仅返回文本类型。
constexpr 函数可以是递归的。
它不能是 虚拟的。 const不能定义 ructor,因为 constexpr 封闭类具有任何虚拟基类。
主体可以定义为 = default 或 = delete。
主体不能包含任何 goto 语句或 try 块。
非模板的显式专用化 constexp