0

マルチスレッド環境。Fooのコンテンツはマルチスレッドにすることができます。

class Foo
{
public:
   const A & getA() {return a_;} //has guard
   void setA(A newA){a_ = newA;} //has guard

private:
    A a_;
};

発信者:

A a  = foo.getA();

私が誰かに尋ねた別の質問では、 const&を返すと、変数の寿命が参照の寿命まで延長されることが保証されている ので、これによれば、値をコピーする必要はなく、setAを呼び出しても安全ですgetAを呼び出した直後にfooが実行されましたが、それに対する多くの議論が提起されたため、これは正しくないと感じています。

安全を確保したいので、署名を次のように変更します。

A & getA() {return a_;}

しかし、コンパイラは、ローカル変数への参照があることを警告します。私が理解している限り(cppの新機能)、戻り値はfoo.aのコピーであるため、理由がわかりません。これの問題は何ですか?

a_contentの変更は気になりません。(_ a.age = 4)。設定するための呼び出しが心配で、呼び出し元の「a」が違法になることを心配しています

4

1 に答える 1

7

あなたはあなたが聞く人にもっと注意する必要があります。一時オブジェクトがすぐにconst-referenceにバインドされた場合にのみ、何かの存続期間が延長されます。たとえば、次のようになります。

Foo bar() { return Foo(); }

int main()
{
    Foo const & f = bar();

    /* stuff */

} // the object referred to by f is extended till here

あなたの状況はそのようなものではありません。特に、const-referenceを返すことは一時オブジェクトを作成しないので、ここでは寿命が延びるものは何もありません。特に、以下は間違いなくエラーです。

A const & bar() { Foo x; return x.getA(); }

int main()
{
    A const & a = bar(); // dangling reference; object dies upon return from Foo::getA()
}
于 2012-07-31T16:02:32.933 に答える