2013-09-16 1 views
7

として関数の戻り値を渡す:は、次のような場合に起こることになって何を参照

int functionA() { 
    return 25; 
} 

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

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

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

+1

一時オブジェクトの定数参照の効果については、C++ 11標準12.2/4,5を参照してください。 – nijansen

答えて

8

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

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

8

そこには「スタック上の戻り値が」ではない(ましてや「スタック」):値でintを返し、そう表現functionA()は、単にタイプintの一時的な値であるfunctionA。この値はfunctionBの定数参照にバインドされ、その有効期間は完全な式の定数であるため、すべて正常です。

関連する問題