c++20读笔-constexpr&consteval


一、constexpr

C++一直有常量表达式的概念,即在编译器求值的表达式。在某些情况下必须使用常量表达式。例如,定义数组时,数组的大小需要为常量表达式。由此限制,以下代码在C++中无效。

const int getArraySize(){ return 32; }
int main (){
	int myArray[getArraySize()];//错误
}

使用constexpr(允许constexpr函数调用其他constexpr函数,但补允许调用任何非constexpr函数。这样的函数不允许有任何副作用,也不能引发异常)。

constexprint getArraySize(){ return 32; }
int main (){
	int myArray[getArraySize()];//正确
}

通过定义constexpr构造函数,可以创建用户自定义类型的常量表达式变量。

class Rect
{
	public:
		constexpr Rect(size_t width, size_t height)
			:m_width { width }, m_height { height }
		constexpr size_t getArea() const { return m_width * m_height ;}
	private:
		size_t m_width { 0 }, height { 0 };
}

constexpr Rect r { 8, 2 };
int myArray[r.getArea()];//ok

二、consteval

constexpr关键字指定函数可以在编译期执行,但不能保证一定在编译期执行,

constexpr double inchTomm(double inch) { return inch * 25; }
constexpr double const_inch { 6.0 };
constexpr double mm1 { inchTomm(const_inch) };//编译期执行

double inch { 6.0 };
constexpr double mml2 { inchTomm(inch ) };//运行期间执行

如果确实希望保证始终在编译期间对函数进行求值,则需要使用C++20的consteval关键字将函数转换为所谓的立即函数。

consteval double inchTomm(double inch) { return inch * 25; }
constexpr double const_inch { 6.0 };
constexpr double mm1 { inchTomm(const_inch) };//编译期执行

double inch { 6.0 };
constexpr double mml2 { inchTomm(inch ) };//编译错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值