9

次の場合はどうなるでしょうか。

int functionA() {
    return 25;
}

void functionB(const int& ref) {
    cout << ref << endl;
}

void start() {
    functionB(functionA());
}

この例をコンパイルすると、正しい値 25 が出力されます。参照のみを使用している場合、スタック上の参照された戻り値を削除 (スタックから削除) すべきではないか、または動作が未定義ですか?

4

2 に答える 2

10

これは「機能する」ためですconst int& ref-参照がconst(変更したくないことを保証する)場合、コンパイラは呼び出し元のコードで一時オブジェクトを生成し(startあなたの場合)、参照を渡します。

を削除すると、の結果を参照に変換できないconstため、コンパイルに失敗します。functionA

于 2013-09-16T14:37:17.350 に答える
9

「スタックに戻り値」はありません (「スタック」は言うまでもありません): by valuefunctionAを返すため、式は単に type の一時的な値です。この値は の定数参照にバインドされ、その有効期間は完全な式の有効期間であるため、すべて問題ありません。int functionA()intfunctionB

于 2013-09-16T14:37:35.263 に答える