boolまたはconst boolを返す必要がありますか?
-
22-07-2019 - |
質問
どちらが良いですか:
bool MyClass::someQuery() const;
const bool MyClass::someQuery() const;
「const bool」を使用しているのは、「intの機能」を聞いたことを覚えていると確信しているからです。 (たとえば、比較演算子の場合)しかし、主にGoogleとIntellisenseが手助けをしてくれないため、どこにもその証拠を見つけることができません;)誰もそれを確認できますか?
私にとってはconst値を返す(これは単なるブール値ではありません)のはもっと理にかなっています。一時的な変更を防ぐことができますが、これはほとんどの場合プログラマーの間違いです。何かをバックアップしたいので、同僚にconst値を返すことを称賛できます:)
解決
だから、あなたはそれが正しいことを知っています、あなたは権威の声の後にいますか?
一時的な偶発的な変更を防ぐことは非常に貴重です。一般に、できる限り多くのことを宣言する必要があります const
、さまざまな事故からあなたを守り、オプティマイザーに役立つヒントを与えます。
スコット・マイヤーズの「Effective C ++」のコピーがあります周り?それらをアイテム3(第3版の18ページ)に向けます;)
例
class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );
if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler
他のヒント
これは、 const
が値を追加せずにコードを膨らませ、読者にもっと考えさせる場合です。この const
のポイントは何ですか?呼び出し元は、値をいくつかの非const変数にコピーし、とにかく必要なことを行うことができます。
if((a * b)= c)
は発生しません 'とにかく組み込み型用にコンパイルするので、組み込み型( bool
を尋ねる質問)またはユーザー定義型のどちらを話しているかは非常に重要です。
組み込み型の場合はまったく意味がないため、使用しないでください。また、ユーザー定義型の場合、私はjalfのキャンプにいます:呼び出し元が返されたオブジェクトを変更したい場合はどうなりますか?
if((a * b)= c)
は、constユーザー定義型を返すための非常に良い引数であると確信していません。コンパイラがこれについて警告するないを見ました。
もう少し具体的に言うと、「オブジェクト」のみ定数にすることができますC ++標準の「オブジェクト」の定義左辺値が参照するすべて(「名前を持っている」)およびクラスタイプの一時データが含まれます。ブール値の戻り値は非クラス型の右辺値であるため、標準に準拠したコンパイラは単に「const」を無視します。この場合。他の人がすでに言ったように、この文脈では役に立たない。
メンバー変数への参照を返す場合、constにするのが理にかなっています。ここではコピーを返しているため、constは必要ありません。
const
修飾子は、参照 const SomeObject&amp; として、またはポインター< code> const SomeObject * )、呼び出し元は参照/ポインターを介してオブジェクトを変更できません。プリミティブ型は値で返されます。つまり、呼び出し側はオブジェクト自体ではなく、オブジェクトのコピーを受け取ります。
したがって、 const
は戻り値の型には実際には適切ではありません。コピーは呼び出された関数の制御外にあるため、呼び出された関数は変更できないことを呼び出し元に指示しないでください。
まったく問題ではありません。したがって、コンセンサスは bool
のみを返すことです。
重要ではない理由は、とにかく非constメンバー関数を呼び出すことができないからです。 bool
はクラスでも構造体でもありません。
boolがコピーされるので、constを置くかどうかは同じです。さらに、コンパイルの問題が発生する可能性があります。
要約:
次の戻り型の値 宣言されたconstは変更できません。この 与えるときに特に便利です クラスの内部への参照ですが、 まれなエラーを防ぐこともできます。
const bool func();
bool f = func();
エラー0、警告0。不要なコードインフレーション以外に何を達成しましたか?
これは古くからの投稿ですが、C ++ 11以降の潜在的なコーナーケースがあることに言及する価値があると思います。他の人が述べたように、C ++ 11 const bool
または bool
を戻り型として使用しても違いはありません> decltype と関連付け、たとえば result_of
では、変数を次のように宣言できます。関数の戻り値と同じ型であるため、この場合、 const
が実際に効果を発揮します。