1. ホーム
  2. c++

[解決済み] return文では、結果を括弧で囲むことは重要ですか?

2023-06-13 04:56:07

質問

関数の中で、この2つの文は違うのですか?

bool returnValue = true;
// Code that does something
return(returnValue);

で、これは?

bool returnValue = true;
// Code
return returnValue;

前者は,括弧で囲んだ returnValue .

どのように解決するのですか?

C++14の時点では、よくあります。

C++14 では、戻り値を囲む括弧がセマンティクスを変更する可能性があるフリンジ ケースが追加されています。このコード スニペットは、2 つの関数が宣言されていることを示しています。唯一の違いは、返り値を囲む括弧です。

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

最初の func1int を返し、2つ目では func1int& . セマンティクスの違いは、直接的に周囲の括弧 .

auto 指定子は、C++11 で導入されました。 C++ 言語仕様 と記述されています。

宣言されている変数の型が、イニシャライザから自動的に推測されることを指定します。 初期化子から推測されることを指定します。関数の場合、戻り値の型が末尾の return 型であるか、または return 文から推測されることを指定します(C++14 以降)。

同様に、C++11 では decltype 指定子が導入され、これは C++ 言語仕様 :

<ブロッククオート

エンティティの宣言された型を検査したり、式の戻り値の型を問い合わせたりします。

[snip]

  1. 引数がオブジェクト/関数の括弧のない名前か、メンバーアクセス式(object.memberまたはpointer->member)である場合、 decltypeはこの式で指定された実体の宣言型を指定する。

  2. 引数がT型の他の式である場合、次のようになります。

    a) 式の値のカテゴリがxvalueである場合、decltypeはT&&を指定します。

    b) expressionの値のカテゴリがlvalueである場合、decltypeはT&&を指定する。

    c) そうでない場合、decltypeはTを指定します。

[snip]です。

オブジェクトの名前が括弧でくくられるとlvalue式になるので、 decltype(arg)と decltype((arg))はしばしば異なる型となることに注意してください。

C++14では decltype(auto) を使用する機能が関数の戻り値型に対して許可されました。元の例は、括弧の意味上の違いが出てくるところです。元の例を再確認する。

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto) は、関数内の末尾のreturn型をreturn文の実体/式から推測することを可能にします。最初のバージョンでは return var1; は事実上、型を返すのと同じです。 decltype(var1) という型を返すのと同じです (つまり int の戻り値)、そして2番目のケースは return (var1); と同じになります。 decltype((var1)) (と同じです。 int & を返す型である)。

括弧によって戻り値の型が int& ではなく int に変更され、意味論が変化します。 この話の教訓 - "戻り値の型にあるすべての括弧が同じように作られているわけではありません"。