我正在研究一些遗留代码而且遇到了一些我不确定是安全的事实 - 事实上我很确定它是未定义的,但我不完全确定为什么(或多或少是一种不好的感觉) )。
由于某种原因,这段代码有一个类,我们称之为A.类A有一个重载的预增量运算符(++),它似乎对包含在其中的指针的值做了一些操作(我们' ll调用指针B)。
我找到了一个函数调用,其中用户传入A,并且在使用已经过载的预增量运算符时发现了指针B的解引用副本。
foo(++A, *B);
由于A的预增量修改了B指向的值,并且B被解除引用并在同一个调用中用作参数...是否有问题或者我应该这样离开?
很抱歉,如果这听起来令人困惑 - 代码太复杂而无法粘贴,但我尽力解释这种情况。如果需要,我会制作一些代表情况的假代码,但我希望它清楚。
另外,我知道这个代码的设计很难分别传入A中已经包含的参数,但是我想知道除了那个之外是否存在实际问题。
答案 0 :(得分:7)
函数参数的评估顺序是未指定的,因此如果任一操作影响另一个操作的值,那么这确实是一个问题。
(但是,在你的代码中,这会以某种方式要求B
成为对A
成员的引用。正如所写,人们不会怀疑可能存在问题(但是你自己注意到了。)
答案 1 :(得分:5)
参数值在进入函数之前计算。计算顺序是不指定。因此,您提供的代码可能会产生意外结果。您可以使用
进行修复++A;
foo(A, *B)
但当然,如你所说,如果B是A的一部分,那么只有A应该通过。