我有一个表单的函数
return_type function(const argument_type & a, argument_type & b);
如果相同的对象作为 a
和 b
传递,我可以继续该函数(从而可能修改它)还是停止?
我不知道编译器假设如何在这种情况下传播。
我的猜测是,将其作为非常量 b
传递的非常量假设应该足够并允许修改,但这是一个猜测。
大多数答案都是关于能够修改a
或b
,或者调用非常量方法。我知道,如果我将同一个对象作为 const
和 non-const
传递,我就可以做到。我的疑问更多在于函数返回时我将离开程序的状态,以及它是否可以打破一些编译器假设,例如:
class A(){
int value;
}
void function1(const A & arg1);
void function2(A & arg1);
void function3(const A & arg1, A & arg2);
A a;
a.value=5;
function1(a);
if(a.value==5){/*...*/;} // the if can be optimized out to true, because [a] was const
a.value=5;
function2(a);
if(a.value==5){/*...*/;} //must be checked, [a] could have been modified
a.value=5;
function3(a, a);
if(a.value==5){/*...*/;} // ???
我发现的最相似的问题(但不是真的)
Modifying self within const method via non const pointer to self
最佳答案
问题
return_type function(const argument_type & a, argument_type & b);
调用function( o , o )
可能是函数
通过形参
b
修改对象,而同时期望形式论证
a
保持不变。
所以你可能会打破函数的假设,导致例如结果不正确或崩溃。
设计 经常有一个函数具有这种签名,即复制赋值运算符。它的常量形式参数 a
是显式提供的参数,而它的可变形式参数(如果可以这样称呼的话)是隐式的 *this
。它可以检查自引用(参数的别名),也可以 copy-and-swap 。
总而言之,您是否可以使用与参数 a
和参数 b
相同的对象安全地调用该函数取决于函数,但您可能会违反函数的假设,它有一个隐含的先决条件,即形式参数引用不同的对象。
关于c++ - 与 const 和非常量相同的对象,我应该假设什么才能正确运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23001360/