名前空間
変種
操作

return 文

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
goto - return
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
ラベル
label : statement
式文
expression ;
複合文
{ statement... }
選択文
if
switch
繰り返し文
while
do-while
for
範囲 for(C++11)
ジャンプ文
break
continue
return
goto
宣言文
declaration ;
try ブロック
try compound-statement handler-sequence
トランザクショナルメモリ
synchronized, atomic_commit など(TM TS)
 

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

目次

[編集] 構文

attr(オプション) return expression(オプション) ; (1)
attr(オプション) return braced-init-list ; (2) (C++11およびそれ以降)
attr(C++11) - オプショナルな任意の個数の属性の並び。
expression - 関数の戻り値の型に変換可能な
braced-init-list - 初期化子または別の波括弧初期化子リストの波括弧で囲まれたリスト。

[編集] 説明

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

[編集] ノート

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

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

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

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

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

expression が最も内側の囲っている関数またはラムダ式の本体内でまたは仮引数として宣言された自動記憶域期間の名前 (括弧で囲っても構いません) である左辺値式の場合、戻り値の初期化のために使用するコンストラクタを選択するためのオーバーロード解決2回行われます。 1回目は expression が右辺値式であるかのように (そのためムーブコンストラクタが選択される可能性があります)、そして、適切な変換が利用可能でないか、選択されたコンストラクタの第1引数の型がそのオブジェクトの型 (cv 修飾されていても構いません) への右辺値参照でない場合は、2回目のオーバーロード解決が、 expression を左辺値とみなして行われます (そのため非 const への参照を取るコピーコンストラクタが選択される可能性があります)。

(C++11およびそれ以降)

関数呼び出しを評価した結果の一時オブジェクト (C++17以前)の結果のオブジェクト (C++17およびそれ以降)のコピー初期化は、 expression の終わりのすべての一時オブジェクトの破棄に対して先行配列されます。 つまり、 return 文を囲っているブロックのローカル変数の破棄に対して先行配列されます。

(C++14およびそれ以降)

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

(C++17およびそれ以降)

[編集] キーワード

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

出力:

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


[編集] 関連項目