1 constexpr函数
功能:既可以在编译期进行调用也可以在运行期进行调用
1.1 编译器被调用
constexpr int fun()
{
return 3;
}
constexpr int x = fun(); // 说明fun在编译期被调用,因为x是编译期常量
int main()
{}
1.2 运行期执行
constexpr int fun(int x)
{
return x+1;
}
int main()
{
int y;
std::cin >> y;
int x = fun(y); // 运行期调用
return x;
}
2 consteval函数
功能:只能在编译器求值。
优点:
1.一定程度提高代码效率,告诉编译器只能在编译期调用。如果用constexpr编译器可能在运行期调用函数。
2.防止误调用:这里的意思是有些函数我们只想在编译期调用提高代码运行效率,但是如果使用constexpr可能本想在编译期执行的,但是在运行期被调用。具体见实例代码。
错误代码:
consteval int fun(int x)
{
return x+1;
}
int main()
{
constexpr int x = fun(3);
int y;
std::cin >> y;
int y2 = fun(y); // 这一行错了,因为y是运行期才能被确定
}
通过错误代码可以看出来,consteval函数只能在编译期执行,无法在运行期执行
实例代码:
consteval int fun(int x)
{
return x+1;
}
int main()
{
constexpr int x = fun(3);
int y2 = fun(y);
}