C++11新标准constexpr关键字

本文详细介绍了C++11中的constexpr关键字,包括其用途、如何声明constexpr变量及函数,以及constexpr在类构造函数中的应用。同时探讨了使用constexpr带来的好处。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

constexpr是C++11新标准规定的规定的关键字。有时我们很难分辨一个初始值是不是常量表达式,当然可以定义一个 
const变量并把它的初始值设为我们认为的某个常量表达式,但在实际使用时,尽管要求如此却常常发现初始值并非常量 
表达式的情况。可以说,这时的对象的定义与使用根本就是两回事。

C++11新标准规定,允许将变量声明为constexpr类型让编译器来验证变量的值是否是一个常量表达式。 
声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化: 
constexpr int mf = 0; // 0 是常量表达式 
constexpr int limit = mf + 1; // mf + 1 是常量表达式 
constexpr int sz = size(); // 只有当 size() 是一个constexpr函数时才是一条正确的声明语句

constexpr函数要求所定义的函数足够简单以使得编译时就可以计算其结果

constexpr int Dec(int i)
{ return i-1; }
constexpr还能修饰类的构造函数,即保证传递给该构造函数的所有参数都是constexpr,那么产生的对象的所有成员都是constexpr, 
该对象也是constexpr对象了,可用于只使用constexpr的场合。 
**注意**constexpr构造函数的函数体必须为空,所有成员变量的初始化都放到初始化列表中。
class Test {
    public: 
        constexpr Test(int arg1, int arg2) : v1(arg1), v2(arg2) {}
    private:
        int v1;
        int v2; 
}

constexpr Test A(1,2)
enum e = {x = A.v1, y = A.v2};

使用constexpr的好处

  1. 是一种很强的约束,更好的保证程序的正确定语义不被破坏;
  2. 编译器可以对constexper代码进行非常大的优化,例如:将用到的constexpr表达式直接替换成结果;
  3. 相比宏来说没有额外的开销。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值