どちらが良いですか:
bool MyClass::someQuery() const;
const bool MyClass::someQuery() const;
「intsの機能」(比較演算子など)を聞いたのを覚えているので、「const bool」を使用していますが、その証拠はどこにも見つかりません。これは主に、GoogleとIntellisenseは何も助けていません;)誰かがそれを確認できますか?
私にとって、const値(これはboolだけではありません)を返す方が理にかなっています。これにより、一時的な変更が防止されます。これは、ほとんどの場合、プログラマーのミスになります。 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ユーザー定義型を返すための良い引数であるとは確信していません。これは、コンパイラーを最後に見たときのことを思い出せないためです notこれについて警告します。
もう少し具体的に言うと、constにできるのは「オブジェクト」だけです。 C++標準の「オブジェクト」の定義には、左辺値が参照するすべてのもの(「名前があります」)とクラスタイプの一時オブジェクトが含まれます。ブール戻り値は非クラス型の右辺値であるため、この場合、標準準拠のコンパイラは「const」を無視します。他の人がすでに言ったように、それはこの文脈では役に立たない。
メンバー変数への参照を返すときは、constにするのが理にかなっています。ここではコピーを返しているので、constは必要ありません。
const
修飾子は、返される戻り値の型にのみ使用されます参照による(参照としてconst SomeObject&
またはポインタを介してconst SomeObject*
)、したがって、呼び出し元は参照/ポインターを介してオブジェクトを変更できません。プリミティブ型が返されます値による。これは、呼び出し元がオブジェクト自体ではなく、オブジェクトのコピーを受け取ることを意味します。
したがって、const
は戻り値型にはあまり適していません。コピーは呼び出された関数の制御外にあるため、呼び出された関数は、変更できないことを呼び出し元に指示するべきではありません。
Boolがコピーされるので、constを置くかどうかは同じです。さらに、コンパイルの問題が発生する可能性があります。
これは古い投稿ですが、C++ 11以降、ここに潜在的なコーナーケースがあることを言及する価値があると思います。他の人が述べているように、C++ 11 bool
とその関連を使用している場合、ほとんどの場合、戻り値の型としてconst bool
とdecltype
のどちらを使用しても違いはありません。 、例えば result_of
、ある関数の戻り値と同じ型の変数を宣言できるので、この場合はconst
が実際に効果を発揮します。
それは完全に問題ではありません。したがって、コンセンサスはbool
だけを返すことです。
それが問題ではない理由は、とにかく非constメンバー関数を呼び出すことができないからです。 bool
はクラスまたは構造体ではありません。
const bool func();
bool f = func();
エラー0、警告0。不必要なコードインフレ以外に何を達成しましたか?
概要:
Constとして宣言されている戻り値の型の値は変更できません。これは、クラスの内部への参照を与えるときに特に役立ちますが、まれなエラーを防ぐこともできます。