◐ Shell
clean mode source ↗

return 文 - cppreference.com

提供: cppreference.com

現在の関数を終了し、指定された値 (もしあれば) を呼び出し元に返します。

構文

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 - 初期化子または別の波括弧初期化子リストの波括弧で囲まれたリスト。

説明

1) expression を評価し、現在の関数を終了し、その expression の結果を、関数の戻り値の型に暗黙に変換した後、呼び出し元に返します。 戻り値の型が void (または cv 修飾された void) の関数では、 expression はオプショナルです。 コンストラクタおよびデストラクタでは、 expression は使用できません。

3,4) コルーチンでは、最終中断点に対して return の代わりにキーワード co_return を使用しなければなりません (詳細についてはコルーチンを参照してください)。

ノート

制御が return 文に遭遇せずに戻り値の型が void (または cv 修飾された void) の関数の終わり、コンストラクタの終わり、デストラクタの終わり、または戻り値の型が void (または cv 修飾された void) の関数の関数 try ブロックの終わりに達した場合は、 return; が実行されます。

制御が main 関数の終わりに達した場合は、 return 0; が実行されます。

return 文なしに値を返す関数 (main を除く) の終わりに達した場合、動作は未定義です。

void を返す関数では、式の型が void であれば、 expression 付きの return 文を使用することができます。

関数呼び出しの戻り値のコピー初期化は expression の終わりのすべての一時オブジェクトの破棄に対して先行配列されます。 また、一時オブジェクトの破棄は return 文を囲んでいるブロックのローカル変数の破棄に対して先行配列されます。

(C++14以上)

コピー省略が用いられない場合、値の返却は一時オブジェクトの構築とコピー/ムーブが発生することがあります。 具体的には、コピー/ムーブの条件は以下の通りです。

ローカル変数および仮引数からの自動ムーブ

expression

  • 非 volatile オブジェクト型または
  • オブジェクト型への非 volatile 右辺値参照
(C++20以上)

のいずれかの型の変数を表す識別子式 (括弧で囲っても構いません) であり、その変数が

  • 最も内側の囲っている関数またはラムダ式の
  • 本体内でまたは
  • 仮引数として
宣言されている

場合、戻り値の初期化のために使用するコンストラクタを選択するため (co_return の場合は promise.return_value() のオーバーロードを選択するため) (C++20以上)オーバーロード解決は、2回行われます。

  • 1回目は expression が右辺値式であるかのように行われ (そのためムーブコンストラクタが選択される可能性があります)、
  • 1回目のオーバーロード解決が失敗したか、
  • 成功したけれどもムーブコンストラクタが選択されなかった (形式的には、選択されたコンストラクタの第1引数が expression の型 (またはその cv 修飾された型) への右辺値参照でなかった)
(C++20未満)
  • 場合は、 expression を左辺値とみなして通常通りのオーバーロード解決が行われます (そのため非 const への参照を取るコピーコンストラクタが選択される可能性があります)。
(C++11以上)

保証されたコピー省略

expression が prvalue の場合、結果のオブジェクトはその式から直接的に初期化されます。 つまり、型が一致するときは、コピーもムーブも行われません (コピー省略を参照してください)。

(C++17以上)

キーワード

return, co_return

#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();
}

出力:

欠陥報告

以下の動作変更欠陥報告は以前に発行された 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

関連項目