13

私はなぜ尋ねることを知っていますか?わからないので、このサイトにとって悪い質問です。しかし、私はそれを口語的な質問の代わりとして意味します、いくつかの考えられる理由は何ですか?

当然、私は自分が書いていることに気づきました。

foo->[i];

そしてそれがうまくいかなかったことを知って驚いた。私は書くつもりでした:

(*foo)[i];

私が言っていることはすでにほとんどわかっていると思いますが、明確にするために、私は考えました

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

に類似します

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

しかし、そうではないようです。なんで?私は何か間違った見方をしているに違いないと確信していますが、何を理解することはできません。私は理論をほとんど知らないので、素人の説明をいただければ幸いです。

しかし、私の例えに明らかな誤りがない場合、言語の設計者がオペレーターを除外した理由として考えられるものは何ですか?あいまいですか?(もしそうなら、何と間違えられるのでしょうか?)


@chrisの推奨に従って、いくつかのコメントを編集に取り入れたいと思います。私は本来あるべきほど明確ではなかったからです。

OPは、2つの組み合わせであるoperator->[]を提案しています。
–クリス
彼は、自分が書き込もうとしているコードが機能しない理由ではなく、自分が欲しいものが存在しない理由を尋ねています。
–マシュー'歯車'オーランド
4

3 に答える 3

4

演算子->の権利はメンバーの名前でなければなりません。明示的なoperatorXYZは、私が推測するメンバーの名前としてカウントされるため、foo->operator[]が許可されます。ただし、 []などのランダムトークンはメンバーの名前としてカウントされないため、foo->[i]は許可されません。

于 2013-01-04T19:20:05.830 に答える
3

言語の設計者が演算子を省略した理由として考えられるものは何ですか?

1:誰もそれを提案しませんでした。それが提案されない場合、それは言語に入りません。

2:それは間違っているように見えます。operator->ポインタを返す場合がありますが、言語での使用は「このポインタを参照してメンバーにアクセスする」ことです。それが言語がで行うことです->。したがって、誰かが見ると->[]、それは正しくないように見えます。->他のすべての場合の右側にあるのは、何らかの形式のメンバー識別子です。

3:このようなマイナーなものを変更するよりも、言語に関係することがはるかに重要だからです。

于 2013-01-04T19:26:26.210 に答える
1

その理由は、C ++では、C配列へのポインターの代わりにvector(またはC ++ 1で)使用する可能性が非常に高いためだと思います。arrayC ++中心のソリューションでは、このような演算子は必要ないため、コンパイラーにとっては余分な作業と見なされていましたが、ほとんどまたはまったくメリットがありませんでした。

2D配列が必要な場合は、foo[0][i]すでにC配列で機能します。

于 2013-01-04T19:27:52.740 に答える