web-dev-qa-db-ja.com

const値で返す目的は?

これのconstの目的は何ですか?

const Object myFunc(){
    return myObject;
}

効果的なC++を読み始めたばかりで、アイテム3がこれを提唱しており、Google検索は同様の提案だけでなく反例も取り上げています。ここでconstを使用することがどのように望ましいかはわかりません。値による戻りが望ましいと仮定すると、戻り値を保護する理由がわかりません。これが役立つ理由の例は、戻り値の意図しないブールキャストを防ぐことです。実際の問題は、明示的なキーワードを使用して暗黙的なブールキャストを防止する必要があるということです。

ここでconstを使用すると、割り当てなしで一時オブジェクトを使用できなくなります。そのため、これらのオブジェクトでは算術式を実行できませんでした。名前のないconstが便利な場合はないようです。

ここでconstを使用すると何が得られ、いつそれが望ましいでしょうか?

編集:算術例を、割り当ての前に実行したいオブジェクトを変更する関数に変更します。

111
Praxeolitic

オブジェクトに対して潜在的に負荷の高い非const操作を実行できる仮想的な状況では、const-valueによって返すことにより、一時的にこの操作を誤って呼び出すことを防ぎます。 +が非const値を返したと想像してください。

(a + b).expensive();

ただし、C++ 11の時代では、値が非定数として返されることを強くお勧めします。そうすることで、非定数の右辺値でのみ意味のある右辺値参照を最大限に活用できます。

要約すると、isはこのプラクティスの根拠ですが、本質的には時代遅れです。

115
Kerrek SB

きれいです無意味 関数からconst値を返します。

difficult で、コードに影響を与えます:

const int foo() {
   return 3;
}

int main() {
   int x = foo();  // copies happily
   x = 4;
}

および

const int foo() {
   return 3;
}

int main() {
   foo() = 4;  // not valid anyway for built-in types
}

// error: lvalue required as left operand of assignment

ただし、 戻り値の型がユーザー定義型である場合はわかります

struct T {};

const T foo() {
   return T();
}

int main() {
   foo() = T();
}

// error: passing ‘const T’ as ‘this’ argument of ‘T& T::operator=(const T&)’ discards qualifiers

これが誰にとっても有益であるかどうかは疑問です。

参照を返すことは異なりますが、Objectが何らかのテンプレートパラメータでない限り、それを行っていません。

返されたオブジェクト(その時点でRValueである)を変更できないようにします。これにより、ユーザーは次のように考えることができなくなります。

myFunc() = Object(...);

myFuncが参照によって返された場合、これはうまく機能しますが、値によって返された場合はほぼ間違いなくバグです(おそらくコンパイラによってキャッチされません)。もちろん、右辺値を持つC++ 11では、constオブジェクトを移動できないため、この規則は以前ほど意味がありません。したがって、パフォーマンスにかなり大きな影響を与える可能性があります。

5
Grizzly