Sai*_*lor 0 c++ qt undefined-behavior
我们来看以下源代码:
const ushort *QString::utf16() const
{
    if (IS_RAW_DATA(d)) {
        // ensure '\0'-termination for ::fromRawData strings
        const_cast<QString*>(this)->reallocData(uint(d->size) + 1u);
    }
    return d->data();
}
reallocData()修改d指针类成员d,请参阅https://code.woboq.org/qt5/qtbase/src/corelib/tools/qstring.cpp.html#_ZN7QString11reallocDataEjb.如果QString对象是const怎么办?根据https://en.cppreference.com/w/cpp/language/const_cast修改const对象并抛弃constness是UB:
struct type {
    int i;
    type(): i(3) {}
    void f(int v) const {
        const_cast<type*>(this)->i = v; // OK as long as the type object isn't const
    }
};
type t; // if this was const type t, then t.f(4) would be undefined behavior
t.f(4);
我们在这段特殊代码中有UB(QString :: utf16())吗?
如果QString调用此方法的对象是const限定的,那么这确实是一个UB :
QString const str{"whatever"};
str.utf16();
请注意,这里的重要部分是对象是const限定的,而不是该方法是const限定的.