《Effective Modern C++》学习笔记 - Item 15: 尽可能使用 constexpr

本文详细解析了C++中的constexpr关键字,介绍了其在对象与函数上的不同应用。对于对象,constexpr确保其为编译期已知的常量;对于函数,当参数为编译期已知时,函数结果也可在编译期计算。此外,还展示了constexpr在复杂场景中的运用,如自定义pow函数及用户定义类型的constexpr成员函数。
  • constexpr 关键字的概念丰富,作用于对象和函数时意义不同。

  • 作用于对象,constexpr 描述的对象是常量,且值在编译期已知

    int sz;								// 未初始化的int
    
    constexpr auto arraySize1 = sz;		// error! sz的值在编译期未知
    const auto arraySize2 = sz;			// ok. arraySize2是sz的const copy。MSVS过编译但链接报错,GCC可以运行且输出为0。

    std::array<int, sz> data1;			// error, std::array的size必须在编译期已知
    std::array<int, arraySize2> data2;	// error, 同上
    
    constexpr auto arraySize3 = 10;		// ok
    std::array<int, arraySize3> data3;	// ok
  • 总结:所有 constexpr 对象都是 const,但不是所有 const 对象都是 constexpr。当你需要保证一个变量是编译期已知(已初始化)的常量时,使用 constexpr 而不是 const

  • 作用于函数,constexpr 描述的函数被调用时如果参数是编译期常量,则其值也在编译期被计算;如果有一个或更多参数在编译期未知,则表现与普通函数一样。相当于是一个纯编译期的常量函数与一个普通函数的二合一。

  • 接下来通过一个情景展示 constexpr 的使用如何扩展到超出你想象的范围。假设我们要在一个 std::array 中存储某个系统的状态,状态的数量(数组空间)大小是 3n3^n3

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值