与const和非const相同的对象,我应该假设什么行为正确?

时间:2014-04-11 00:16:18

标签: c++ compiler-construction const standards

我有一个

形式的功能
return_type function(const argument_type & a, argument_type & b);

如果同一个对象作为ab传递,我可以继续使用该函数(从而可能修改它)或停止吗?

我不了解编译器假设如何在这种情况下传播。

我的猜测是,作为非const b传递的非常量假设应该足够并允许修改,但这是猜测。


大多数答案都是能够修改ab,或者调用非const方法。我知道如果我传递constnon-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

4 个答案:

答案 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参数,成员函数强制执行约束。等等。