1

次のコードを g++ または clang++ でコンパイルすると、「returning reference to temporary object」(g++) および「returning reference to local temporary object」(clang++) という警告が表示されます。

なぜgetData_warningこれらの警告が表示されるのに対し、表示されないのかについて誰かが教えてくれますgetData_nowarningか?

struct Geom {
    int * data;
};


// Not ideal because one can change the pointed to value
int * const & getData_nowarning (Geom const & geom) {
    return geom.data;
}


// Ideal because one cannot change the pointed to value.
int const * const & getData_warning (Geom const & geom) {
    return geom.data;    //   <-------------------  WARNING HERE
}


void test () {
    Geom const geom = { new int(0) };

    int * data1 = getData_nowarning(geom);

    int const * data2 = getData_warning(geom);
}
4

1 に答える 1

3

の型は であるため、geom.dataint*の参照で参照することはできませんint const*。への参照を作成するにはint const*、まず が必要ですint const*。したがって、変換が必要なため、新しい型の新しいポインターを作成する必要があり、一時的でなければなりません。

geom オブジェクトのポインターが指すものを変更できるようにするには、関数の呼び出し元が必要ですか? ポインター自体を const にしているので、そうではないようです。したがって、参照を削除するだけで、const を保持できます。

于 2013-04-18T22:57:49.807 に答える