c++ 如何防止意外调用非const对象上的mutating函数?

假设我们有一个类型为myType的Object obj,并且我们想将它传递给函数Foo,它返回我们关于obj的一些有价值的信息。函数Bar是在其中声明obj并从中调用Foo,如下所示:

void Bar ()
{

myType obj; //default constructor

string valuableInfo = Foo(obj); 

//do other stuff
//...

} //end of Bar()

这段代码当然不会说太多关于Foo是否以obj作为引用或值,以及Foo是否以任何方式修改obj。

当然如果Foo使用obj作为值或const引用,我们不会有任何问题。

string Foo (const myType & input); //this is fine 
string Foo (myType input); //so is this

但我们不能保证这一点!函数签名可能很好

string Foo (myType & input); //asking for trouble!!

但是它是非常不方便的检查每个函数的签名,我们想要传递obj,所以我们怎么能指定,我们只想传递我们的对象到承诺不修改它的函数?

当然一种方法是将obj声明为const,但是这种方法的问题是我们失去了灵活性。如果我们想在调用Foo(obj)之后在Bar()中修改obj,该怎么办?

void Bar ()
{

const myType obj; //default constructor

string valuableInfo = Foo(obj); //compiler will complain if Foo's signature doesnt match

//we can't modify obj here :(
//...

} //end of Bar()

明显但不好的解决方案是这样做:

void Bar ()
{

myType obj; //default constructor

const myType immutableObj {obj}; //copy ctr call
//this is expensive and not recommended if obj is big! want to avoid

string valuableInfo = Foo(immutableObj); //will get the valuable Info risk free
// compiler will complain if Foo has inappropriate signature

//do other stuff
//...

} //end of Bar()

所以什么是最好的解决方案?有没有办法静态断言Foo对我们传入的对象是非侵入性的?我们可以暂时使obj const(而不必创建一个新的const对象)或某事的效果?

最佳答案
Foo(static_cast<const myType&>(obj));

转载注明原文:c++ 如何防止意外调用非const对象上的mutating函数? - 代码日志