当方法只接受Foo*const时,我应该const_cast"this"吗?

Kas*_*een 10 c++ qt

我有一个类Foo,它是一个自引用树状结构(最低限度):

class Foo {
    public:
        // Gets this child's position relative to it's parent.
        int getPosition() const {
             return parent->indexOf(this);
        }

        int indexOf(const Foo *const child) const {
            return children.indexOf(child); // this line causes an error.
        }
    private:
        Foo *parent;
        QList<Foo *> children;
}
Run Code Online (Sandbox Code Playgroud)

该行return children.indexOf(child)期望const T &value按照QList文档传递,这解决Foo *const &value了我的方案.

为了让我的getPosition()方法调用我自己的indexOf()方法,需要const Foo *child至少具有一个签名,以便this从const方法传递.(因为这是const Foo *const).

我的代码不会编译,因为const Foo *const child无法转换Foo *const childQList::indexOf.我的方法都没有修改对象状态,因此它们应该是const(即我不想getPosition为了接收非const而花费成本this).

所以问题是,我如何从thisconst上下文(const Foo *const)到QList::indexOf需要的东西.我是否应该this在内部进行常规构建,getPosition因为我知道我的indexOf(及后续调用)不会改变它?

还有什么我应该做的吗?也许我的设计有缺陷.

Dav*_*own 5

我认为这是一个非常合理的用例const_cast,但不是this你需要的const_cast,但是child.在这种情况下,QList::indexOf需要一个指向a Foo(Foo* const)child的常量指针,但它是一个指向constant Foo(const Foo* const)的常量指针.没有隐式转换Foo* const,const Foo* const因为这会从指向的值中删除const-ness.

因此,要修改代码,我会将行更改为

return children.indexOf(const_cast<Foo*>(child));
Run Code Online (Sandbox Code Playgroud)

你知道QList::indexOf不会修改任何child指向,所以这不会产生未定义的行为.然而,我会添加一条评论,解释为什么这const_cast是必要的.