1

オブジェクトの参照をエイリアスとして使用することは常に安全ですか? たとえば、文字列:

std::string test;
std::string &reftest( test );
std::cout << "test before: " << test << "\n";
std::cout << "reftest before: " << reftest << "\n";
reftest = "abc";
std::cout << "test after: " << test << "\n";
std::cout << "reftest after: " << reftest << "\n";

reftest と test が常に同じ文字列を持つという保証はありますか?

4

5 に答える 5

4

参照をニックネームと考えると役立ちます。あなたが言っているのにreftest、あなたはまだを参照していtestます。つまり、要するに、はい。

いくつかの制限があることに注意してください。たとえば、次は標準ではありません。

std::string &reftest( std::string("test") );

でもこれは

const std::string &reftest( std::string("test") );

これは、const 参照は一時的にバインドできますが、非 const 参照はバインドできないためです。

于 2012-05-17T20:32:19.500 に答える
4

ロバートという名前の人がボブと呼ばれるのと同じように、それら同じ文字列です。

あなたが言うように、それは同じものの2つの名前です-エイリアス。

于 2012-05-17T20:32:50.373 に答える
3

はい。2 つの名前は同じオブジェクトを参照します。

名前にはいくつかの違いがありますが。たとえばdecltype(reftest)、 と同じ型は生成されませんdecltype(test)

また、他の人が指摘しているように、使用が合法ではない参照を取得する方法がありますが、その場合は、参照が正当な変数のエイリアスではないためです。

于 2012-05-17T20:32:29.057 に答える
3

あなたの例ではそうですが、落とし穴があります:

struct X {
  std::string& s;
  X(std::string& s) : s(s) {}
};
struct Y {
  std::string s;
};

int main() {
  Y* y = new Y();
  X x(y->s);
  delete y;
  // now, x.s is dangling, as it refers to y->s, which is gone.
  std::cout << x.s << std::endl; // <- segfault
  return 0;
}
于 2012-05-17T20:34:11.267 に答える
0

はい。どちらもメモリ内の同じ場所を指しています。各変数のアドレスを出力すると、これが表示されます。

于 2012-05-17T20:31:50.067 に答える