return 文
現在の関数を終了し、指定され��値 (もしあれば) を呼び出し元に返します。
目次 |
[編集] 構文
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) | - | オプショナルな任意の個数の属性の並び。 |
expression | - | 関数の戻り値の型に変換可能な式。 |
braced-init-list | - | 初期化子または別の波括弧初期化子リストの波括弧で囲まれたリスト。 |
[編集] 説明
[編集] ノート
制御が return 文に遭遇せずに戻り値の型が void
(または cv 修飾された void) の関数の終わり、コンストラクタの終わり、デストラクタの終わり、または戻り値の型が void
(または cv 修飾された void) の関数の関数 try ブロックの終わりに達した場合は、 return; が実行されます。
制御が main 関数の終わりに達した場合は、 return 0; が実行されます。
return 文なしに値を返す関数 (main を除く) の終わりに達した場合、動作は未定義です。
void を返す関数では、式の型が void であれば、 expression 付きの return 文を使用することができます。
関数呼び出しの戻り値のコピー初期化は expression の終わりのすべての一時オブジェクトの破棄に対して先行配列されます。 また、一時オブジェクトの破棄は return 文を囲んでいるブロックのローカル変数の破棄に対して先行配列されます。 |
(C++14以上) |
コピー省略が用いられない場合、値の返却は一時オブジェクトの構築とコピー/ムーブが発生することがあります。 具体的には、コピー/ムーブの条件は以下の通りです。
ローカル変数および仮引数からの自動ムーブexpression が
のいずれかの型の変数を表す識別子式 (括弧で囲っても構いません) であり、その変数が
場合、戻り値の初期化のために使用するコンストラクタを選択するため (co_return の場合は promise.return_value() のオーバーロードを選択するため) (C++20以上)のオーバーロード解決は、2回行われます。
|
(C++11以上) |
保証されたコピー省略expression が prvalue の場合、結果のオブジェクトはその式から直接的に初期化されます。 つまり、型が一致するときは、コピーもムーブも行われません (コピー省略を参照してください)。 |
(C++17以上) |
[編集] キーワード
[編集] 例
#include <iostream> #include <string> #include <utility> void fa(int i) { if (i == 2) return; std::cout << i << '\n'; } // 暗黙の return; int fb(int i) { if (i > 4) return 4; std::cout << 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(2); // i==2 の場合は何もせずに return します。 fa(1); // 引数を表示して return します。 int i = fb(5); // 4 を return します。 i = fb(i); // 引数を表示し、 2 を return します。 std::cout << i << '\n' << fc("Hello", 7).second << '\n'; fd(); }
出力:
1 4 2 7 10
[編集] 欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
CWG 1579 | C++11 | return by converting move constructor was not allowed | converting move constructor look up enabled |
CWG 1885 | C++14 | sequencing of the destruction of automatic variables was not explicit | sequencing rules added |
[編集] 関連項目
return 文 の C言語リファレンス
|