用例和`this [i]`的行为

Sta*_*eur -1 c++ this

我想知道什么是使用范围this[i].我知道这显然是一个无用的问题但是请说它是科学.索引标准允许的行为是什么this?我没有找到有关它的信息,cppreference.


愚蠢的例子:

#include <iostream>

class foo {
public:
  int value;
  void bar(std::size_t size, int a) {
    for (std::size_t i = 0; i < size; i++) {
      this[i].value = a--;
    }
  }
};

int main() {
  foo foos[42];
  (*foos).bar(sizeof foos / sizeof *foos, 42);
  for (auto &foo : foos) {
    std::cout << foo.value << std::endl;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它只允许使用数组吗?也许.遗产怎么样?我认为这是未定义的行为.你知道一些用例吗?这只是一些问题this[i],如果你不愿意,不要直接回答这些问题.

Vit*_*meo 8

this只是一个指针.该ptr[n]语法是相同的*(ptr + n).

你知道一些用例吗?

不,没有正当理由可以使用this[n].类本身不应该假设当前实例是数组的一部分,或者在连续内存中有其他实例关闭.

以这样的方式设计类,使其独立于实例化的位置/方式.


您的代码可以进行现代化/改进.

  1. 使用std::array而不是C风格的数组.

  2. 不要做手动指针算术.

  3. foo只处理当前实例.

  4. endl除非您想要刷新cout缓冲区,否则请勿使用.请\n改用.

class foo {
public:
  int value;
  void bar(int a) {
    this->value -= a;
  }
};

int main() {
  std::array<foo, 42> foos;
  for (auto &foo : foos) {
    foo.bar(1);
    std::cout << foo.value << '\n';
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)