2

演算子のオーバーロードの引数リストが体系的な方法でどのように決定されるかを完全に理解したことはありません。特に、現在の問題に混乱しています。

単項演算子をオーバーロードすると、引数が1つ、またはクラスメンバーの場合はゼロになります。二項演算子をオーバーロードすると、2つの引数があり、クラスメンバーの場合は1つの引数があります。少なくとも、それが機能しているように見える方法です。operator newただし、(クラスメンバーではなく)問題が発生しています。

私が作業しているコードベースには、過去に見た他の場所(たとえばここなど)と同様に、メモリデバッグ用#define new new(__FILE__, __LINE__)の署名など​​を使用したdefinelikeおよび対応する関数があります。void *new(size_t size, const char *file, unsigned line)私のプロジェクトのものは、実際には以前にリンクされたものとは異なることに注意してください。何らかの理由で新しい配置を台無しにしているので、これは私にとって問題を提示します。私はC++プログラミング言語を調べましたが、それがこれを説明しているのなら、私はそれを見逃しています。

newこの点で特別ですか?つまり、特定の言語で定義された追加のデバッグ署名がありますか?上で述べたように、場所によってわずかに異なる署名が表示されているため、そのようには見えません。もしそうなら、他のどの演算子が非自明な署名を持っていますか、そしてそれらは何ですか?これらのさまざまな署名は、代わりにいくつかの実装固有の追加機能ですか?もしそうなら、ほとんどの実装が何をするかについての一般的なルールはありますか?あるいは、それは私が私のタイトルで暗示したようなアリティの問題ですか?署名で必要な数の追加の引数を追加するnewことができますか?キーワード自体と必要な新しい型の間の引数を使用してnewを呼び出す場合は、何でもできますか?それとも私はさらに混乱していて、他に何か足りないものがありますか?

最も重要なのは、短期的には(私はこれを本当に理解したいのですが)、何が私の配置を台無しにしているのnewでしょうか?マクロがのような展開を引き起こしていnew ("file.cpp", 100) (class_pointer) class_tます。括弧内の2つのグループの問題は多分、それとも何か他のものですか?

4

2 に答える 2

2

演算子newは、必要な数のオーバーロードを提供できるという点で関数に近く、コンパイラーは関数のオーバーロードルールに基づいてバージョンを選択します。

したがって、これを行うnew ((T1)value1, (T2)value2) TYPEと、次の場所にルーティングされます。

operator new(size_t, T1, T2);

マクロの問題は、プレーンバージョンのnewを呼び出していることを前提としており、プリプロセッサを使用してそれをデバッグnewの呼び出しに変換できることです。別のバージョンのnewを呼び出す必要がある場合、マクロは壊れています。

配置を新規(またはその他の特別な新規)と呼ぶ必要がある場合は、そのマクロをオフにすることで問題を修正できます。

#undef new
于 2010-02-12T23:26:17.913 に答える
0

オーバーロードされた演算子のアリティは、あなたが宣言するものです。記号(+)にちなんで名付けられた演算子の場合、追加の引数を持つように定義すると、明示的な呼び出しを介してのみ呼び出されます。(演算子+(a、b、c、d、e))。new演算子の場合、少なくとも1つの引数を指定する必要がありますが、必要な数だけ指定できます。通常の演算子のオーバーロードは、どちらが呼び出されるかを決定します。

于 2010-02-12T23:27:13.510 に答える