【问题标题】:Why isn't ->[] an operator in C++? (a subscript operator for dereferenced array pointers) [closed]为什么 ->[] 在 C++ 中不是运算符? (取消引用数组指针的下标运算符)[关闭]
【发布时间】:2012-12-19 06:11:18
【问题描述】:

我知道问为什么? 对这个网站来说是个糟糕的问题,因为我们不知道。不过,我的意思是用它作为询问的口语替代,有哪些可能的原因?

我自然而然地发现自己在写作,

foo->[i];

并惊讶地发现它不起作用。我的意思是写:

(*foo)[i];

我相信大多数人已经明白我的意思,但要清楚,我想

bar.subscript(i);
foo->subscript(i);

类似于

bar.operator[](i);
foo->operator[](i);

但这似乎并非如此。为什么?我确定我一定是以错误的方式看待某些事情,但我不知道是什么。我知道的理论很少,所以外行的解释将不胜感激。

如果我的类比没有明显的错误,那么语言的设计者可能将操作符排除在外的一些可能原因是什么? 是否模棱两可? (如果是这样,会误认为是什么?)


按照@chris 的建议,我想在编辑中加入一些 cmets,因为我并没有像我应该做的那样清楚:

OP 提出 operator->[],两者的结合。
– chris
他问的是为什么他想要的东西不存在,而不是为什么他试图编写的代码不起作用。
– Matthew 'Cogwheel' Orlando

【问题讨论】:

  • 一个有趣的问题是“会很难解析”。我不知道这个问题的答案。
  • @Yakk,我怀疑它是否有效。我正要对此发表评论。
  • 因为当时没有人想到它,也没有人足够关心它来使其成为标准。这就是 99% 的“X 看起来不错,为什么 C++ 没有 X”问题背后的原因。对于这样的问题尤其如此:告诉人们写(*x).[i]而不是x->[i]要容易得多,而不是完成更改标准文本、测试它、确保没有可怕的疏忽等所有工作...
  • 我喜欢这个问题问为什么不“foo->[i];”但随后使用正确的“foo->operator[](i);”在解释为什么它应该起作用。
  • @GManNickG:我遇到了我不得不使用.operator->()形式的代码(迭代器包装器),所以人们也应该知道这是一个选项.

标签: c++ programming-languages operators


【解决方案1】:

operator->的权限必须是会员名。我猜一个明确的 operatorXYZ 算作成员的名字,所以 foo->operator[] 是允许的。但是,诸如 [] 之类的随机标记不能算作成员的名称,因此 foo->[i] 是不允许的。

【讨论】:

  • 这就是为什么它相当于operator->[](foo, i);
  • 如果这就是答案,那我还不太明白,但是……
  • @acheong87,这个答案基于->[] 是两个独立的运算符。正如您所要求的,将它们合并为一个可以使其正常工作。
【解决方案2】:

语言的设计者可能将操作员排除在外的一些可能原因是什么?

1:没有人提议。如果它没有被提议,它就不会进入语言。

2:看起来不对。 operator-> 可能会返回一个指针,但它在语言中的使用是“引用这个指针并访问一个成员”。这就是语言对-> 的作用。所以当有人看到->[] 时,它看起来不正确。在其他情况下,-> 右边的东西是某种形式的成员标识符。

3:因为与语言有关的事情远比改变这样的小事情要重要得多。

【讨论】:

  • foo->(bar) = baz->[snaf] -- 哦,别忘了foo->++!哦,还有foo->[bar]->[snaf]->[meh] = 7——想想我们可以从中得到的语法!
  • 啊,好的。不,我同意,也许这不是一个值得做出的提议,更不用说值得做出的改变了。我问得更多是因为我认为我的逻辑有问题,而不仅仅是人为/主观因素。谢谢。
  • @Yakk - 啊,实际上,我发现你的例子说明了为什么这个可能被省略的一个重要原因!我没有意识到必须引入大量其他运算符才能与我所说的保持一致。
【解决方案3】:

我想原因是在 C++ 中,您很有可能会使用 vector(或 C++1 中的 array)而不是指向 C 数组的指针。在以 C++ 为中心的解决方案中,不需要这样的运算符,因此它可能被认为是编译器的额外工作,而几乎没有好处。

如果您需要二维数组,那么 foo[0][i] 已经可以使用 C 数组了。

【讨论】:

  • 嗯?只要你有一个指向带有operator[] 的指针或迭代器,我就可以看到这个运算符的用途,这在 C++ 中似乎比在 C 中更可能(尽管总体上不是很常见)。
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 2021-01-23
  • 1970-01-01
  • 2012-05-22
  • 2017-02-12
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多