【c++】constexpr与consteval

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之所以被提出是希望有些函数强制的在编译期就被调用,以提高性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值