Qt 示例 const_cast

Qt example const_cast

我正在检查 one of Qt's examples。在这个例子中,他们有一个简单的 TreeItem class 放在树上:

class TreeItem
{
public:
    explicit TreeItem(const QVector<QVariant> &data, TreeItem *parentItem = nullptr);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parentItem();

private:
    QVector<TreeItem*> m_childItems;
    QVector<QVariant> m_itemData;
    TreeItem *m_parentItem;
};

int row() const;方法的实现中,他们使用了一个const_cast:

int TreeItem::row() const
{
    if (m_parentItem)
        return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));

    return 0;
}

对我来说,这听起来像是未定义的行为。如果这个对象实际上定义为 const 怎么办?但由于这是在官方网站上作为示例,我想知道我是否正确。起初我认为也许意图是永远不要创建 const TreeItem 但是将 row 方法标记为 const 将毫无意义。
问题:是否像示例中那样一直在 this 上使用 const_cast

这不是未定义的行为。 const_cast 只有当您开始的对象是 const 并且您修改了从强制转换中获得的对象时,才是未定义的行为。

return m_parentItem->m_childItems.indexOf(const_cast<TreeItem*>(this));

不会修改 const_cast<TreeItem*>(this),因为 indexOf 需要 const T&