2

C++ 標準では、添字を使用して式を後置式として定義しています。私の知る限り、この演算子は常に 2 つの引数を取ります (最初の引数は T へのポインターで、もう 1 つは列挙型または整数型です)。したがって、二項演算子としての資格が必要です。

ただし、 MSDNIBMはそれを二項演算子としてリストしていません。

問題は、添字演算子とは何ですか? 単項ですか、それとも二項ですか。確かに、$5.3 で言及されていないため (少なくともすぐに)、単項ではありません。

標準が後置式のコンテキストでの使用法に言及しているとき、それはどういう意味ですか?

4

4 に答える 4

1

二項演算子は正しいですoperator[]が、メンバー関数でなければならないという点で特別です。

に似ているoperator()

ここで接尾辞の式を読むことができます

operator[]接尾辞の表現に関する興味深い記事をここで見つけました

于 2010-11-29T09:17:32.427 に答える
1

operator[]オブジェクトへの(おそらく暗黙的な)参照と、他の型の値(必ずしも列挙型または整数型ではない)の2つの引数を取るため、厳密な意味での二項演算子であるという点で、私はあなたに同意する傾向があります。 . ただし、これはブラケット演算子であるため、有効な添え字式である tokens のシーケンスは[x]x抽象的な意味での後置単項演算子としての資格があると言えます。カリー化を考えてください。

operator[](const C&, size_t)また、たとえばglobal をオーバーロードすることはできません。コンパイラはoperator[]、非静的メンバー関数でなければならないと文句を言います。

于 2010-11-29T09:02:41.897 に答える
1

そのカウントで [] が使用されているのはコンテキストだと思います。セクション 5.2.1 では、記号 [] が「*((E1)+(E2)) と (定義により) 同一である」後置式のコンテキストで使用されています。このコンテキストでは、[] は演算子ではありません。セクション 13.5.5 では、添字演算子を意味していました。この場合、引数を 1 つ取る演算子です。たとえば、私が書いた場合:

 x = a[2];

上記のステートメントが次のように評価されるとは限りません。

x = *(a + 2);

「a」はオブジェクトである可能性があるためです。a がオブジェクト型の場合、このコンテキストでは [] が添字演算子として使用されます。

とにかく、それは明らかな矛盾を解決する標準から導き出すことができる最良の説明です.

于 2010-11-29T09:27:38.380 に答える
0

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2Bをよく見ると、あなたが言ったように、標準のC++がoperator[]を二項演算子として認識することがわかります。Operator []は、一般的にバイナリであり、単項にする可能性はありますが、クラス外では意味がない場合でも、クラス内では常にバイナリとして使用する必要があります。

それは私があなたに提供したリンクでよく説明されています...時々多くのプログラマーは彼らが何をしているかについてあまり考えずに演算子をオーバーロードし、時には間違った方法でそれらをオーバーロードすることに注意してください。コンパイラはこれで簡単に受け入れられますが、おそらく、その演算子をオーバーロードする正しい方法ではありませんでした。

私があなたに提供したようなガイドに従うことは、正しい方法で物事を行うための良い方法です。

したがって、演算子が適切な方法なしでオーバーロードされる例(標準外)に常に注意し、最初に標準メソッドを参照し、それらに準拠する例を使用してください。

于 2010-11-29T09:14:06.267 に答える