【问题标题】:Is this defined?这是定义的吗?
【发布时间】:2016-06-30 01:37:47
【问题描述】:

假设我有以下课程:

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

然后我有这个:

A myA;
myA.method(myA);

我已经告诉编译器method 不会更改this 实例,但编译器是否意识到我可以将this 实例作为参数传入?

我这样做会破坏一些东西吗?这是已定义的行为吗?

【问题讨论】:

  • 是的,你可以做到。编译器无法知道它们是否是同一个实例。如果您不希望更改传递的参数,则应将参数类型设为const
  • @songyuanyao 没有....但是我确实想改变它
  • 那就没事了。您可以通过传递的参数来更改它。
  • const 表示方法中this->不会改变对象,但仍可能通过其他方式改变对象
  • 附带说明:编译器通常根本不会根据函数参数(包括 this 指针)的常量进行优化。

标签: c++ constants language-lawyer


【解决方案1】:

这完全没问题,不是问题。您在此示例中所做的有时称为“别名” - 当两个参数实际上引用同一个对象时。

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

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

该函数接受两个指向ints 的指针,并将第二个添加到第一个。当然,这段代码使用我的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 */ }
}

【讨论】:

  • 我主要担心的是我的程序可能依赖于“未定义的行为”所以我只是想仔细检查.....谢谢
猜你喜欢
  • 1970-01-01
  • 2015-09-09
  • 2020-06-15
  • 1970-01-01
  • 2011-08-26
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多