Namespaces
Variants

return statement

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
goto - return
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

現在の関数を終了し、指定された値(存在する場合)を呼び出し元に返します。

目次

構文

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

説明

1) 式を評価し、現在の関数を終了して式の結果を呼び出し元に返します(関数の戻り値の型への 暗黙変換 を経た後)。この式は、戻り値の型が(CV修飾された可能性のある) void である関数ではオプションであり、コンストラクタおよびデストラクタでは許可されません。
2) 関数の戻り値を構築するために copy-list-initialization を使用します。
3,4) コルーチンでは、最終停止ポイント(詳細は coroutines を参照)に対して、 return の代わりに co_return キーワードを使用する必要があります。

または 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 が使用される場合は除きます。具体的には、コピー/ムーブの条件は以下の通りです:

ローカル変数とパラメータからの自動ムーブ

式は、自動ストレージ期間を持つ変数を名前とする(括弧で囲まれた可能性のある) 識別子式 であり、その変数の型が以下の場合に ムーブ適格 となります:

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

かつその変数が、最も内側の囲み関数またはラムダ式の

  • 本体で宣言されている
  • またはパラメータとして宣言されている

場合です。

(C++11以降)

式がムーブ適格である場合、 オーバーロード解決 が返される値の初期化に使用するコンストラクタを選択するために 2回 実行されます:

  • 最初のオーバーロード解決が失敗した場合
(C++11以降)
(C++23以前)
  • または成功したが、 ムーブコンストラクタ を選択しなかった場合(形式的には、選択されたコンストラクタの最初のパラメータが式の(CV修飾された可能性のある)型への右辺値参照ではなかった場合)
(C++11以降)
(C++20以前)
  • その後、通常通りにオーバーロード解決が実行され、式は左辺値として扱われます(したがって コピーコンストラクタ を選択する可能性があります)。
(C++11以降)
(C++23以前)

式がムーブ適格である場合、それはxvalueとして扱われます(したがってオーバーロード解決は ムーブコンストラクタ を選択する可能性があります)。

(C++23以降)

保証されたコピー省略

式がprvalueである場合、結果オブジェクトはその式によって直接初期化されます。これは型が一致する場合、コピーまたはムーブコンストラクタを関与しません( コピー省略 を参照)。

(C++17以降)
機能テストマクロ 規格 機能
__cpp_implicit_move 202207L (C++23) より簡素化された 暗黙のムーブ

キーワード

return , co_return

#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