return
statement
現在の関数を終了し、指定された値(存在する場合)を呼び出し元に返します。
目次 |
構文
attr
(オプション)
return
expression
(オプション)
;
|
(1) | ||||||||
attr
(オプション)
return
braced-init-list
;
|
(2) | (C++11以降) | |||||||
attr
(オプション)
co_return
expression
(オプション)
;
|
(3) | (C++20以降) | |||||||
attr
(オプション)
co_return
braced-init-list
;
|
(4) | (C++20以降) | |||||||
| attr | - | (C++11以降) 任意の数の attributes のシーケンス |
| expression | - | expression 関数の戻り値の型に変換可能な式 |
| braced-init-list | - | brace-enclosed initializer list |
説明
式 または braced-init-list (C++11以降) (存在する場合)は、 オペランド として知られています。これは return 文のものです。
|
関数呼び出しの結果のコピー初期化と、 expression の終了時におけるすべての一時オブジェクトの破棄との間に シーケンスポイント が存在する。 |
(C++11まで) |
|
関数呼び出しの結果のコピー初期化は、 expression の終了時におけるすべての一時オブジェクトの破棄に対して シーケンスされる前に 行われ、これはさらに、 return 文を囲むブロックのローカル変数の破棄に対して シーケンスされる前に 行われる。 |
(C++11から) |
|
関数の戻り値型が参照型であり、 return 文 (1,2) が返される参照を 一時オブジェクト式 の結果にバインドする場合、プログラムは不適格である。 |
(C++26から) |
制御が終端に達した場合
- 戻り値の型(CV修飾されている可能性もある)が void である関数、
- コンストラクタ、
- デストラクタ、または
- 関数 try ブロック (戻り値の型が(CV修飾されている可能性もある) void である関数用)
return
文に出会わずに、
return
が実行された場合、
return
;
が実行されます。
制御が
main
関数
の終端に達した場合、
return
0
;
が実行されます。
値を返す関数(
main
関数
および特定の
コルーチン
(C++20以降)
を除く)の終端に達し、
return
文がない場合、その動作は未定義です。
(可能性としてcv修飾された) void を返す関数において、 return 文に expression を指定することが可能です。ただし、式の型が(可能性としてcv修飾された) void である場合に限ります。
|
関数の戻り値型が プレースホルダ型 として指定されている場合、それは戻り値から 推論 されます。 decltype ( auto ) が使用された場合、型推論は エンティティ となり得る 式 を エンティティ として扱います。 |
(C++14以降) |
注記
値による返却は、一時オブジェクトの構築とコピー/ムーブを含む可能性があります。ただし、 copy elision が使用される場合は除きます。具体的には、コピー/ムーブの条件は以下の通りです:
ローカル変数とパラメータからの自動ムーブ式は、自動ストレージ期間を持つ変数を名前とする(括弧で囲まれた可能性のある) 識別子式 であり、その変数の型が以下の場合に ムーブ適格 となります:
|
(C++11以降) |
|
(C++20以降) |
|
かつその変数が、最も内側の囲み関数またはラムダ式の
場合です。 |
(C++11以降) |
|
式がムーブ適格である場合、 オーバーロード解決 が返される値の初期化に使用するコンストラクタを選択するために 2回 実行されます:
|
(C++11以降)
(C++23以前) |
|
(C++11以降)
(C++20以前) |
|
(C++11以降)
(C++23以前) |
|
式がムーブ適格である場合、それはxvalueとして扱われます(したがってオーバーロード解決は ムーブコンストラクタ を選択する可能性があります)。 |
(C++23以降) |
保証されたコピー省略式がprvalueである場合、結果オブジェクトはその式によって直接初期化されます。これは型が一致する場合、コピーまたはムーブコンストラクタを関与しません( コピー省略 を参照)。 |
(C++17以降) |
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_implicit_move
|
202207L
|
(C++23) | より簡素化された 暗黙のムーブ |
キーワード
例
#include <iostream> #include <string> #include <utility> void fa(int i) { if (i == 2) return; std::cout << "fa("<< i << ")\n"; } // 暗黙のreturn; int fb(int i) { if (i > 4) return 4; std::cout << "fb(" << i << ")\n"; return 2; } std::pair<std::string, int> fc(const char* p, int x) { return {p, x}; } void fd() { return fa(10); // fa(10)はvoid式 } int main() { fa(1); // 引数を出力してreturn fa(2); // i == 2のとき何もせずreturn int i = fb(5); // 4を返す i = fb(i); // 引数を出力して2を返す std::cout << "i = " << i << '\n' << "fc(~).second = " << fc("Hello", 7).second << '\n'; fd(); } struct MoveOnly { MoveOnly() = default; MoveOnly(MoveOnly&&) = default; }; MoveOnly move_11(MoveOnly arg) { return arg; // OK. 暗黙のmove } MoveOnly move_11(MoveOnly&& arg) { return arg; // C++20以降OK. 暗黙のmove } MoveOnly&& move_23(MoveOnly&& arg) { return arg; // C++23以降OK. 暗黙のmove }
出力:
fa(1) fb(4) i = 2 fc(~).second = 7 fa(10)
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 1541 | C++98 | expression は戻り値型がcv修飾された void の場合に省略できなかった | 省略可能 |
| CWG 1579 | C++11 | 変換ムーブコンストラクタによる戻り値が許可されていなかった |
変換ムーブ
コンストラクタのルックアップが有効化 |
| CWG 1885 | C++98 | 自動変数の破棄の順序が明示的ではなかった | 順序規則が追加された |
関連項目
|
C ドキュメント
for
return
statement
|