[解決済み] return文では、結果を括弧で囲むことは重要ですか?
質問
関数の中で、この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))
最初の
func1
は
int
を返し、2つ目では
func1
は
int&
.
セマンティクスの違いは、直接的に周囲の括弧
.
は
auto
指定子は、C++11 で導入されました。
C++ 言語仕様
と記述されています。
宣言されている変数の型が、イニシャライザから自動的に推測されることを指定します。 初期化子から推測されることを指定します。関数の場合、戻り値の型が末尾の return 型であるか、または return 文から推測されることを指定します(C++14 以降)。
同様に、C++11 では
decltype
指定子が導入され、これは
C++ 言語仕様
:
エンティティの宣言された型を検査したり、式の戻り値の型を問い合わせたりします。
[snip]
-
引数がオブジェクト/関数の括弧のない名前か、メンバーアクセス式(object.memberまたはpointer->member)である場合、 decltypeはこの式で指定された実体の宣言型を指定する。
-
引数が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
に変更され、意味論が変化します。
この話の教訓 - "戻り値の型にあるすべての括弧が同じように作られているわけではありません"。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] <は<=より速いのか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】Enterキーを押して続行する
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む