正在将常量结构引用转换为非常量指针

Converting const struct reference to non-const pointer

本文关键字:常量 非常 指针 转换 结构 引用      更新时间:2023-10-16

我正在研究如何将常量结构引用转换为非常量结构指针。

我有一个名为Foo:的结构

struct Foo
{
    Foo& someFunc()
    {
        //do something
        return *this;
    }
};

我有一个方法:

struct Bar
{
    Foo* fooPointer;
    void anotherFunc(const Foo& foo)
    {
        // set fooPointer to foo's pointer
    }
};

我会这样称呼它:

Foo foo;
Bar bar;
bar.anotherFunc(foo.someFunc());

但是我该如何编写另一个Func()呢?

void anotherFunc(const Foo& foo)
{
    fooPointer = &foo;  // <-- This doesn't work as foo is still const
}

最好的答案是"不要那样做,太疯狂了"。如果指针类型不用于修改对象,请将其更改为const Foo*;如果要修改对象,则更改对Foo&的引用。

如果你真的有充分的理由放弃const正确性,那么就有一个演员阵容

fooPointer = const_cast<Foo*>(&foo);

但首先要考虑为什么要这样做,以及如何防止出现以指向const对象的非const指针结束的错误。或者更糟的是,一个指针指向了一个在其消亡后挥之不去的暂时性。

您可以直接接受它作为指向Foo的指针或非常量引用。

按照你通过Foo的方式,如果没有const_cast,你将无法做到这一点,除非在少数确切的情况下,否则这感觉是错误的。

当您使用指向非常数Foo的指针存储它时,您也应该将该参数作为非常数。想想这个接口:你的结构有一个函数,它接受了一个带有const限定的Foo,这意味着"我只会达到它的峰值",但你的函数会强制转换它,并以允许修改的方式存储它。这有点像对代码的用户撒谎(而且你是代码的第一个用户)。