这是定义好的吗?

6

假设我有以下的类:

struct A{
  void method(A& otherA) const{
    /* Mutate otherA */
  }
};

然后我有了这个:

A myA;
myA.method(myA);

我已经告诉编译器method不会改变this实例,但是编译器是否意识到我可以将this实例作为参数传递?这样做会破坏一些东西吗?这是定义好的行为吗?

是的,您可以做到。编译器无法知道它们是否是同一个实例。如果您不希望传递的参数被更改,应将参数类型设置为 const - songyuanyao
@songyuanyao 不是...但我想要改变它 - DarthRubik
那就没问题了。你可以通过传递参数来更改它。 - songyuanyao
7
const 表示对象在方法内不会被通过 this-> 改变,但仍可能会被其他方式改变。 - M.M
2
顺便提一下:编译器通常不会根据函数参数的const属性(包括this指针)进行优化。 - MikeMB
1个回答

10

这完全没有问题。在本例中,您所做的有时被称为“别名”——当两个参数实际上指向同一个对象时。

考虑在普通C中更简单的情况:

void foo(int* a, const int* b) { *a += *b; }

那个函数接受两个指向 int 的指针,并将第二个指针加到第一个指针上。当然,使用我的 foo 函数的这段代码是完全有效的:

int x = 10;
foo(&x, &x); // now x is 20

如果您不喜欢这种情况下的行为,最好的方法可能是在您的方法中添加一个检查,例如:

如果您不喜欢这种情况下的行为,最好的方法可能是在您的方法中添加一个检查,例如:

void A::method(A& otherA) const {
    if (this == &otherA) { /* aliasing detected */ }
    else { /* proceed as normal */ }
}

我的主要担忧是我的程序可能依赖于“未定义行为”,所以我只想再次确认一下.....谢谢。 - DarthRubik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接