我有一个
形式的功能return_type function(const argument_type & a, argument_type & b);
如果同一个对象作为a
和b
传递,我可以继续使用该函数(从而可能修改它)或停止吗?
我不了解编译器假设如何在这种情况下传播。
我的猜测是,作为非const b
传递的非常量假设应该足够并允许修改,但这是猜测。
大多数答案都是能够修改a
或b
,或者调用非const方法。我知道如果我传递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
答案 0 :(得分:1)
的问题
return_type function(const argument_type & a, argument_type & b);
并且调用function( o , o )
就是函数
通过形式参数b
修改对象,而
同时期望正式论证a
保持不变。
所以你可能会破坏函数的假设,导致例如不正确的结果或崩溃。
设计有一个函数经常有这种签名,即复制赋值运算符。它的常量形式参数a
是明确提供的参数,它的可变形式参数(如果可以称之为)是隐式*this
。它可以检查自引用(参数的别名),也可以复制和交换。
总之,是否可以安全地使用与参数a
相同的对象调用函数以及作为参数b
取决于函数,但可能会违反函数' s假设,它具有正式论证引用不同对象的隐含前提条件。
答案 1 :(得分:0)
您决定是否可以使用两次相同的参数调用该函数 无论如何,只要算法的正确性不依赖于它或者你没有给出任何保证,你就不应该试图确定你是否获得了两次相同的对象。
答案 2 :(得分:0)
它们在运行时以完全相同的方式传递,相同的引用/指针完全相同。
与const
的区别仅在编译时发生。编译器将确保您只调用const
方法,而不是尝试修改此const
对象的属性,否则会抛出编译错误,因为您不应该修改它。
答案 3 :(得分:0)
我的猜测是,作为非常数b传递的非常数假设应该足够并允许修改,但它是一个猜测。
是的,function
可以通过const
调用非b
方法,但不能通过a
调用。
直观地说,这意味着如果同一个对象也通过非function
引用传入,const
可以通过a
引用const
更改传入的对象b
。
通常,const
仅保证您使用const
变量可以做什么或不做什么。可能有其他变量引用const
变量,或者对其中的对象,可能使const
变量被一个看起来不像#的函数修改。 39;修改const
变量。
回到你的案例,它比你的function
更高级别的函数和类自己强制使用const
参数,成员函数强制执行约束。等等。