代码之家  ›  专栏  ›  技术社区  ›  Curious

常量转换空基类

  •  6
  • Curious  · 技术社区  · 8 年前

    是否有未定义的行为 const_cast 去掉一个空的基类并对其调用一个非常量方法?例如

    class EmptyBase {
    public:
        void bar() { ... }
    };
    
    class Something : public EmptyBase {
    public:
        void foo() const {
            const_cast<EmptyBase&>(static_cast<const EmptyBase&>(*this)).bar();
       }
    };
    

    我在标准(C++14和C++17)中找不到回答这个问题的相关信息。。

    1 回复  |  直到 8 年前
        1
  •  8
  •   Barry    8 年前

    它本身并不是UB。当您丢弃constness并使用获得的glvalue修改最初声明为const的对象时,会得到未定义的行为。这是这个的标准报价( [dcl.type.cv]/4 ):

    除了任何声明为可变的类成员都可以修改之外,任何 尝试在常量对象的生存期内修改该对象会导致 未定义的行为。

    仅仅调用成员函数并不是对对象的修改。这完全取决于功能 . 所以如果它做了一些疯狂的事情,比如:

    std::memset(this, 0, sizeof(*this));
    

    这肯定会导致未定义的行为。但假设没有,既然有 无成员 如果要以格式错误的方式进行修改,则调用中没有UB。

    另一个问题,即这是否是一个好主意,有一个明显的答案。Const cast不应丢弃代码基。但是,如果基类表现良好,尽管定义不好,但如果您不能更改该类,那么它可能是可以接受的。

    推荐文章