2

私はこの投稿、私はこれを見ました:

class MonitorObjectString: public MonitorObject {
    // some other declarations
    friend inline bool operator==(/*const*/ MonitorObjectString& lhs,
                                  /*const*/ MonitorObjectString& rhs)
    { return lhs.fVal==rhs.fVal; }
}

続行する前に、これは非常に重要です。

  • 私は誰のコーディング能力にも疑問を抱いていません。
  • なぜ誰かが比較で非定数参照を必要とするのか疑問に思っています。
  • その質問 のポスターはそのコードを書いていませんでした。

これは念のためでした。これも重要です:

  • 両方を追加/*const*/し、コードを再フォーマットしました。

ここで、トピックに戻ります。

by-ref引数を変更できる等式演算子の適切な使用法は考えられません。あなたは?

4

5 に答える 5

5

おそらく彼らはを忘れていましたconst。演算子のオーバーロード一貫して動作し、「文字外」のアクションを実行しないようにする必要があります。

原則として、等式演算子は、比較しているオブジェクトを変更しないでください。宣言constすると、コンパイラレベルでこれが強制されます。しかし、それはしばしば省略されます。「定数の正確さ」は、C++では見過ごされがちです。

于 2008-12-19T15:44:34.360 に答える
5

おそらく、クラスは遅延初期化の形式を使用します。データにアクセスするときは、適切な初期化を行い、データをフェッチする必要があります。これにより、クラスメンバーが変更される場合があります。

ただし、レイジー初期化を形成できるため、クラスを変更する必要はありません。これは、Pimplイディオム(プライベートクラスへのポインター)を使用するか、mutableキーワード(推奨されません!)を使用することで実現できます。

于 2008-12-19T15:45:58.290 に答える
2

あなたが提起した問題には、もっと不可解な問題があります。

すでに const になっている sが 2 つある場合MonitorObjectString、この等価関数は使用できません。

于 2008-12-19T17:00:32.850 に答える
1

この場合、非定数引数の要件は明らかにありません。あなたのように、一般的なケースもないと思います。

ただし、const-correctnessの問題がコードの下位レベルから上に押し上げられる可能性があるのは確かです。下位レベルで修正できない場合は、上位レベルで回避する必要があります。おそらくそれはある時点でここで起こったことですか?

于 2008-12-19T15:45:36.357 に答える
1

オペランドを変更しているためにconstを使用できない場合は、演算子のオーバーロードをひどく誤用しています。

実装が非const関数を呼び出すためにconstを使用できない場合は、実際にそれらをクリーンアップするか、少なくともconstの代替を提供する必要があります。

constを使用しないコードを呼び出す場合は、とにかくconstを使用し、利用可能な最も深いポイントでconst_castを使用して、コメントします。

Shmooptyが指摘したように、演算子は、constオブジェクトの1つだけであっても、constオブジェクトでは使用できないため、本来よりもはるかに有用性が低くなります。「a==5」をサポートしない数値等式演算子は、驚き最小の原則に大きく違反します。

于 2008-12-19T17:10:14.190 に答える