const构建空基类

时间:2017-12-21 06:43:45

标签: c++ c++14 language-lawyer c++17 const-cast

const_cast一个空基类并在其上调用非const方法是不确定的行为?例如

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 个答案:

答案 0 :(得分:7)

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

  

除了声明可变的任何类成员都可以修改,任何   尝试在其生命周期内修改const对象   未定义的行为。

仅仅调用成员函数不是对象的修改。这一切都取决于所做的功能。所以,如果它像疯了一样:

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

这肯定会导致未定义的行为。但假设它没有,并且由于没有成员以便以错误的方式进行修改,因此呼叫中没有UB。

另一个问题,无论是否是一个好主意,都有一个明显的答案。 Const强制转换不应该丢弃代码库。但是如果基类表现良好,虽然没有明确定义,但如果你不能改变这个类,那么它是可以接受的。