名前空間
変種
操作

return

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
goto - return
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

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

目次

[編集] 構文

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以降) 任意の数の属性のシーケンス
- 、関数戻り値型に変換可能
波括弧初期化子リスト - 波括弧で囲まれた初期化子リスト

[編集] 説明

1) expression を評価し、現在の関数を終了して、関数戻り値型への暗黙的な変換の後、expression の結果を呼び出し元に返します。expression は、戻り値の型が(cv修飾されている可能性のある)void の関数ではオプションであり、コンストラクタおよびデストラクタでは許可されていません。
2) コピーリスト初期化を使用して、関数の戻り値を構築します。
3,4) コルーチンでは、最終的な中断点では return の代わりに co_return キーワードを使用する必要があります(詳細はコルーチンを参照)。

関数呼び出しの結果のコピー初期化と、expression の末尾にあるすべての一時オブジェクトの破棄との間にシーケンスポイントが存在します。

(C++11まで)

関数呼び出しの結果のコピー初期化は、expression の末尾にあるすべての一時オブジェクトの破棄の前に順序付けされ、それはさらに return 文を囲むブロックのローカル変数の破棄の前に順序付けされます。

(C++11以降)

関数の戻り値型が参照型であり、return(1,2) が返された参照を一時式の結果にバインドする場合、プログラムは不正です。

(C++26以降)

制御が

  • 戻り値の型が(cv修飾されている可能性のある)void の関数の末尾、
  • コンストラクタの末尾、
  • デストラクタの末尾、または
  • 戻り値の型が(cv修飾されている可能性のある)void の関数の関数 try ブロックの末尾

に return 文に遭遇せずに到達した場合、return; が実行されます。

制御がmain 関数の末尾に到達した場合、return 0; が実行されます。

main 関数と特定のコルーチン(C++20以降)を除き、return 文なしで値を返す関数の末尾にフローオフすることは未定義動作です。

戻り値の型が(cv修飾されている可能性のある)void の関数では、式の型が(cv修飾されている可能性のある)void であれば、expression を伴う return 文を使用できます。

関数の戻り値の型がプレースホルダー型として指定されている場合、戻り値から推論されます。

(C++14以降)

[編集] 注釈

コピーエリジョンが使用されない限り、値による返却は一時オブジェクトの構築とコピー/ムーブを伴う場合があります。具体的には、コピー/ムーブの条件は次のとおりです。

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

expression は、自動記憶域期間を持つ変数を指定する(括弧で囲まれている可能性のある)識別子式であり、その型が

  • 非 volatile オブジェクト型
(C++11以降)
  • または非 volatile rvalue 参照型
(C++20以降)

であり、かつその変数が

  • 本体内
  • またはパラメーターとして

最も内側の囲む関数またはラムダ式で宣言されている場合に、ムーブ可能です。

(C++11以降)

expression がムーブ可能な場合、返される値の初期化に使用するコンストラクタを選択するためのオーバーロード解決または、co_return の場合、promise.return_value() のオーバーロードを選択するため(C++20以降)2回実行されます。

  • まず、expression が rvalue 式であるかのように(したがって、ムーブコンストラクタが選択される場合があります)、次に
  • 最初のオーバーロード解決が失敗した場合
(C++11以降)
(C++23まで)
  • または成功したが、ムーブコンストラクタを選択しなかった場合(正式には、選択されたコンストラクタの最初のパラメータがexpression の(cv修飾されている可能性のある)型への rvalue 参照ではなかった場合)
(C++11以降)
(C++20まで)
  • 通常通りオーバーロード解決が実行され、expression は lvalue と見なされます(したがって、コピーコンストラクタが選択される場合があります)。
(C++11以降)
(C++23まで)

expression がムーブ可能な場合、xvalue として扱われます(したがって、オーバーロード解決によりムーブコンストラクタが選択される場合があります)。

(C++23から)

保証されたコピーエリジョン

expression が 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";
} // implied 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) is a void expression
}
 
int main()
{
    fa(1); // prints its argument, then returns
    fa(2); // does nothing when i == 2, just returns
 
    int i = fb(5); // returns 4
    i = fb(i);     // prints its argument, returns 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. implicit move
}
 
MoveOnly move_11(MoveOnly&& arg)
{
    return arg; // OK since C++20. implicit move
}
 
MoveOnly&& move_23(MoveOnly&& arg)
{
    return arg; // OK since C++23. implicit move
}

出力

fa(1)
fb(4)
i = 2
fc(~).second = 7
fa(10)

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
CWG 1541 C++98 戻り値の型が cv 修飾された void の場合、expression は省略できませんでした。 省略可能です。
CWG 1579 C++11 変換ムーブコンストラクタによる返却は許可されていませんでした。 変換ムーブ
コンストラクタ検索が有効になりました。
CWG 1885 C++98 自動変数の破棄の順序付けが明示的ではありませんでした。 順序付けルールが追加されました。

[編集] 関連項目

returnCドキュメント
English 日本語 中文(简体) 中文(繁體)