0
#include<iostream>
#include<conio.h>

using namespace std;

 /* test class: created the reference of 
    abc class locally in function getRef() 
    and returned the reference.*/

class abc {
    int var;

    public:
        abc():var(5) {}
        abc(int v):var(v) {}
        abc & getRef() {
            abc myref(9);
            return myref;
        }
        void disp() {
            cout<<var<<endl;
        }       
};

int main() {
    abc a;
    abc b=a.getRef(); 
    b.disp();  /* this statement executed perfectly. 
               I think compiler should throw error here. */
    getch();
    return 0;
}

コンパイラはコンパイルエラーをスローする必要があります。説明してください ?

4

2 に答える 2

1

b.disp();エラーが発生する場所ではないため、コンパイラはエラーとしてフラグを立てるべきではありません。エラーはにreturn myref;あり、これがハードエラーではない理由は、オブジェクトの存続期間が。の後に終了するかどうかを判断するのが一般に非常に難しいためreturnです。この場合、それは簡単であり、一部のコンパイラはそれについて警告しようとします。警告レベルを確認してください。

編集:ちなみに、gccでは、警告はデフォルトで有効になっており、「警告:ローカル変数'...'への参照が返されました」のように見えます。

于 2012-07-26T10:12:14.897 に答える
0

G++ はこれについて適切に警告しb.disp();ますが、実際にはその行の戻り値を使用しておらず、上記の行にコピーしたため、エラーは発生せず、エラーも発生しないはずです。

: In member function ‘abc& abc::getRef()’:
:17: warning: reference to local variable ‘myref’ returned

コンパイラがこれについて警告しない場合は、警告レベルを確認してください

また:

#include<conio.h>

これは移植可能なコードにはなりません。

于 2012-07-26T10:14:37.443 に答える