字面值常量类

数据成员都是字面值类型的聚合类是字面值常量类。

如果一个类不是聚合类,成为一个字面值常量类符合的要求:

  • 数据成员都必须是字面值类型。
  • 类必须至少含有一个 constexpr 构造函数。
  • 如果一个数据成员含有类内初始值,则内置类型成员的初始值必须是一条常量表达式。或者如果成员属于某种类类型,则初始值必须使用成员自己的 constexpr 构造函数。
  • 类必须使用析构函数的默认定义,该成员负责销毁对象。

constexpr 构造函数

一个字面值常量类必须至少提供一个 constexpr 构造函数。

constexpr 构造函数体一般应该是空的。

通过前置关键字 constexpr 就可以声明一个 constexpr 构造函数:

class Debug
{
public:
    constexpr Debug(bool b = true) : hw(b), io(b), other(b) {}
    constexpr Debug(bool h, bool i, bool o) : hw(h), io(i), other(o) {}
    constexpr bool any() { return hw || io || other; }
    void set_io(bool b) { io = b; }
    void set_hw(bool b) { hw = b; }
    void set_other(bool b) { hw = b; }

private:
    bool hw;    //硬件错误,而非IO错误
    bool io;    //IO错误
    bool other; //其他错误
};

constexpr 构造函数必须初始化所有数据成员,初始值或者使用 constexpr 构造函数,或者是一条常量表达式。

constexpr 构造函数用于生成 constexpr 对象以及 constexpr 函数的参数或返回类型:

constexpr Debug io_sub(false, true, false); //调试IO
if (io_sub.any())                           //等价于if(true)
    cerr << "print appropriate error messages" << endl;
constexpr Debug prod(false);                //无调试
if (prod.any())                             //等价于if(false)
    cerr << "print an error message" << endl;
posted @ 2019-10-07 15:47  CodeWithMe  阅读(447)  评论(0)    收藏  举报