1.constexpr 修饰函数
被constexpr修饰的函数既可以在编译期被求值(调用),也可以在运行期被求值(调用)。在下面代码中分别给出了这两种情况
#include <iostream>
constexpr int fun(int x)
{
return x + 1;
}
int main()
{
//fun()函数编译器被求值,因为a是编译期常量。
constexpr int a = fun(3);
//fun()函数运行期被求值
int y = 0;
std::cin >> y ;
return fun(y) ;
}
在上面代码中,因为变量a是被constexpr修饰的编译期常量。顾名思义就是a在编译期就可以被确定值的大小,因此fun()函数在此时也应该在编译期被求值,然后初始化a。第二种情况变量y需要等待用户输入然后从键盘上读取值存入y中,这种只能在运行期才能确定y的值,所以此时fun()函数是运行期被求值,然后返回。
既然被constexpr修饰的函数既可以在编译期被求值,又可以在运行期被求值。那我们就必须保证函数本身是同时满足这两种情况的。运行期被求值是没什么好说的,下面举一个反例说明函数不可以在编译期被求值的情况。
#include <iostream>
constexpr int fun(int x)
{
int y = 0;
std::cin >> y;
return x + 1;
}
int main()
{
//fun()函数编译器被求值,因为a是编译期常量。
constexpr int a = fun(3); //报错
}
上面代码是错误的,fun()函数被constexpr修饰,但是它不可能在编译期被求值。因为y只有运行期才能确定。
2.consteval
consteval是c++20提出的,与constexpr不同的是,consteval修饰的函数只能在编译期被求值。consteval之所以被提出是希望有些函数强制的在编译期就被调用,以提高性能。