如何返回可以更改的成员?

Avi*_*ano 0 c++

多线程环境.Foo的内容可以是多线程的.

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

private:
    A a_;
};
Run Code Online (Sandbox Code Playgroud)

呼叫者:

A a  = foo.getA();
Run Code Online (Sandbox Code Playgroud)

另一个问题,我问有人告诉我, 如果你返回const&它保证变量的生命时间将延长到参考的生命周期 ,所以根据这个我不需要复制值,我安全即使调用setA on foo在我打电话给getA之后就完成了,但是反对它的很多争论都被araised了,所以我觉得这不正确.

我想保持安全,所以我将签名更改为:

A & getA() {return a_;}
Run Code Online (Sandbox Code Playgroud)

但是编译器仍然警告我已经引用了局部变量.我不明白为什么,因为据我所知(cpp新手),返回值是foo.a的副本,那么问题是什么呢?

我并不担心改变a_内容.(_ a.age = 4).我担心呼叫设置,呼叫者中的'a'将是非法的

Ker*_* SB 7

你听的时候需要更加小心.如果临时对象立即绑定到const-reference ,则唯一的时间会延长某些事物的生命周期.例如,像这样:

Foo bar() { return Foo(); }

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

    /* stuff */

} // the object referred to by f is extended till here
Run Code Online (Sandbox Code Playgroud)

你的情况就是这样.特别是,返回一个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()
}
Run Code Online (Sandbox Code Playgroud)