1

だから私はいくつかのコードを調べています、そして私はこれを見ます:

class whatever 
{
public:
    void SomeFunc(SomeClass& outVal)
    {
        outVal = m_q.front();
        m_q.pop();
    }

private:
    std::queue<SomeClass> m_q;
};

これは、 outVal が有効な参照になるとは思えません... ただし、機能するようです。

これは以前に他のコードでも見たことがありますが、これは有効ですか? ありがとう

4

3 に答える 3

6

参照はポインタのようなものではないことに注意してください。作成後にリバウンドすることはできません。つまり、私がそうするなら

int a;
int b;
int &c = a;

その範囲全体で、cへの割り当ては実際にはaへの割り当てを意味します。それで、

int a = 2;
{
   int b = 3;
   int &c = a;
   c = b;
   b = -5;
}
printf("%d",a); // prints "3".

したがって、この場合、参照は削除されたオブジェクトを指していません。むしろ、の戻り値はm_q.front()、代入演算子を介して、outVal参照にコピーされます。

于 2009-10-18T23:54:26.407 に答える
2

以前の返信で書いたことは、まったくナンセンスでした。(私の元の応答に賛成した人は、それを取り戻してください:)

この例では、参照は死にかけているオブジェクトにバインドされていませんが、前面のオブジェクトの値が別のオブジェクトにコピーされています(参照によって参照されます)。コピーはキューとは独立して存在し続け、キューの先頭が破棄されてもコピーに悪影響はありません。

ここで何が起こっているかについての素晴らしい説明については、Crashworksの返信を参照してください。

于 2009-10-18T23:52:03.663 に答える
2

有効です。outVal参照する参照を再配置するのではなく、参照でサポートされているものではなく、参照する変数(実際には左辺値)にm_q.front()割り当てます。m_q.front()outVal

  SomeClass c;
  someWhatever.SomeFunc(c);

次のように動作すると考えることができます:

  SomeClass c;
  c = someWhatever.m_q.front();
  someWhater.m_q.pop();
于 2009-10-18T23:55:00.267 に答える