zoukankan      html  css  js  c++  java
  • 字面值常量类

    我们提到过 constexpr 函数的参数和返回值必须是字面值类型。

    除了算术类型、引用和指针外,某些类也是字面值类型。和其他类不同,字面值类型的类可能含有constexpr函数成员。这样的成员必须符合constexpr函数的所有要求,它们是隐式 const 的。

    数据成员都是字面值类型的聚合类是字面值常量类。如果一个类不是聚合类,但它符合下述要求,则它也是一个字面值常量类:

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

    constexpr构造函数

    尽管构造函数不能是 const 的,但是字面值常量类的构造函数可以是 constexpr函数。事实上,一个字面值常量类必须至少提供一个 constexpr 构造函数。

    constexpr构造函数可以声明成=default的形式(或者是删除函数的形式)。

    否则,constexpr构造函数就必须既符合构造函数的要求(意味着不能包含返回语句),又符合constexpr函数的要求(意味着它能拥有的唯一可执行语句就是返回语句)。

    综合这两点可知,constexpr 构造函数体一般来说应该是空的。我们通过前置关键字 constexpr 就可以声明一个 constexpr 构造函数了:

    class Dubug{
    public:
        constexpr Debug(bool b = true) : hw(b), is(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 bw;            // 硬件错误,而非IO错误
        bool io;            // IO错误
        bool other;         // 其他错误
    };
    

    constexpr 构造函数必须初始化所有数据成员,初始值或者使用constexpr构造函数,或者是一条常量表达式。
    constexpr 构造函数用于生成 constexpr 对象以及 constexpr 函数的参数或返回类型∶

    constexpr Debug io_sub(false, true, false);
    if (io_sun.any()){
        cerr << "print appropriate error message" << endl;
    }
    
    constexpr Debug prod(false);
    if (prod.any()){
        cerr << "print an error message" << endl;
    }
    
  • 相关阅读:
    通过 INotifyPropertyChanged 实现观察者模式(转)
    Asp.net MVC中的ViewData与ViewBag(转)
    FireFox地址栏百度搜索
    ZigBee设备类型
    Array.prototype.slice.call(arguments) (转)
    泛型方法扩展
    定义IE的文档兼容模式
    C# Lazy<T>(转)
    AutoCAD2010/2012去掉搜索框
    python 集合类型
  • 原文地址:https://www.cnblogs.com/lihello/p/14384648.html
Copyright © 2011-2022 走看看