对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)中的相关信息。
答案 0 :(得分:7)
这不是UB本身。当你抛弃constness并使用获得的glvalue来修改最初声明为const的对象时,你会得到未定义的行为。以下是此标准报价([dcl.type.cv]/4):
除了声明可变的任何类成员都可以修改,任何 尝试在其生命周期内修改const对象 未定义的行为。
仅仅调用成员函数不是对象的修改。这一切都取决于所做的功能。所以,如果它像疯了一样:
std::memset(this, 0, sizeof(*this));
这肯定会导致未定义的行为。但假设它没有,并且由于没有成员以便以错误的方式进行修改,因此呼叫中没有UB。
另一个问题,无论是否是一个好主意,都有一个明显的答案。 Const强制转换不应该丢弃代码库。但是如果基类表现良好,虽然没有明确定义,但如果你不能改变这个类,那么它是可以接受的。