小编Sai*_*lor的帖子

QString :: utf16():UB是不是?

我们来看以下源代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

我们在这段特殊代码中有UB(QString :: utf16())吗?

c++ qt undefined-behavior

0
推荐指数
1
解决办法
91
查看次数

标签 统计

c++ ×1

qt ×1

undefined-behavior ×1