constexpr允许函数在编译时或运行时被调用,而consteval则要求函数必须在编译时被调用。 constexpr函数可以在运行时有一个普通函数的行为,而consteval函数则不能在运行时被调用。 由于consteval更加强制性地要求函数的结果必须在编译时计算,因此它可以用于更严格的编译时元编程场景。
constexpr用于声明一个函数或对象是一个常量表达式,即在编译时就可以确定其值。在函数中使用constexpr关键字,可以确保函数在编译时被求值,从而避免在运行时进行计算,提高程序的性能。另外,constexpr也可以用于声明类的成员函数和构造函数,以确保在编译时就可以确定这些函数的行为。 consteval是C++ 20新增的关键字,用于...
C++ 20进一步放松了对constexpr函数的限制,允许它们执行更复杂的逻辑,包括:循环、递归等,甚至调用其他constexpr函数。 #include<iostream>usingnamespacestd;constexprintAdd(intnNum1,intnNum2){returnnNum1+nNum2;}intmain(){constexprautonSum=Add(100,200);static_assert(nSum==300,"Compile-time check fai...
我知道 constexpr 函数也可以使用在运行时评估的参数来调用,这与 consteval 函数不同(请参阅示例代码中的 ***),但为什么我需要它呢?我的意思是我也可以使用普通函数。int FunNormal() { return 12345; } consteval int FunConstEval(int p) { return p+3; } constexpr int FunConstExpr(int p) { ...
constexpr的主要作用是声明变量的值或函数的返回值可以在常量表达式(即编译期便可计算出值的表达式)中使用,没有constexpr函数之前,我们无法在需要编译期常量的地方使用函数的返回值。 当引用变量用constexpr修饰时,这个引用变量所指向的object必须也在编译期获得明确的初始化,即初始化涉及到的所有运算都必须是可以在编译...
C++20 中大量的算法和容器可以使用constexpr,这意味着你甚至可以再编译期vector<int>进行排序 Algorithms library - cppreference.com 如下: #include <iostream> #include <ranges> #include <vector> #include <unordered_set> #include <algorithm> #include <format> constexpr int maxElement() { std:...
C++11引入constexpr关键字,当用于函数的声明时,可以指示函数可以在编译时求值。constexpr关键字的引入是为了在编译时进行更多的计算,以提高程序的性能和效率。在C++14和C++17中,constexpr关键字的功能得到了扩展,允许在函数体内执行更多的操作,包括循环和条件语句,这样可以更灵活地定义编译时求值的函数。
if consteval可以检测一个constexpr函数在常量表达式上下文中被调用的情况。该提案说明了它被引入的动机,用于意图从constexpr函数中调用consteval函数的情况。为了理解这意味着什么,我们考虑以下示例。 假设我们有一个consteval函数f: consteval int f( int i ) { ... } f只能在常量表达式中调用。另一方面,constexpr...
constexprvsconsteval Fast forward to C++20, we have another keyword:consteval. This time it can be applied only to functions and forces all calls to happen at compile time. For example: constevalintsum(inta,intb){returna+b;}constexprintsum_c(inta,intb){returna+b;}intmain(){constexprau...
相关的写法是[expr.const]/13: 如果表达式或转换是立即函数的潜在评估显式或隐式调用并且不在立即函数上下文中,则它是立即调用。立即调用应是常量表达式。 请注意“或转换”和“隐式调用”这两个词- 这似乎意味着该规则旨在应用于每个函数调用。1单个原子表达式的求值可以由多个此类调用组成,例如new 表达式可以调用...