我正在尝试研究如何将const结构引用转换为非const结构指针。
我有一个名为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());
但是如何编写anotherFunc()?
void anotherFunc(const Foo& foo)
{
fooPointer = &foo; // <-- This doesn't work as foo is still const
}
答案 0 :(得分:5)
最好的答案是“不要那样做,这很疯狂”。如果指针类型不会用于修改对象,则将指针类型更改为const Foo*
;如果指针类型将引用,则将其更改为Foo&
。
如果你真的有充分的理由放弃const-correctness,那么就有一个演员
fooPointer = const_cast<Foo*>(&foo);
但首先要考虑为什么要这样做,以及如何防止以const对象的非const指针结束的错误。或者更糟糕的是,指向一个临时的指针,它会在它消亡后徘徊。
答案 1 :(得分:4)
您可以直接接受它作为Foo
的指针或非const引用。
您通过Foo
的方式,如果没有const_cast
,您将无法做到这一点,除非在一些精确的情况下感觉不对。
当您使用指向非const Foo
的指针存储它时,您应该将参数作为非const也使用。考虑一下这个界面:你的struct有一个函数,它带有Foo
const限定条件,暗示&#34;我只会在它上面达到峰值&#34;但是然后你的函数转换它并以一种方式存储它允许修改。这有点像对代码的用户撒谎(而且你是代码的第一个用户)。