如何返回可以更改的成员

How to return member that can be changed?

本文关键字:成员 何返回 返回      更新时间:2023-10-16

多线程环境。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&保证变量的寿命将延长到参考的寿命,所以根据这一点,我不需要复制值,即使在我调用getA之后立即对foo上的setA进行了调用,我也是安全的,但很多反对它的论点都被夸大了,所以我觉得这是不正确的。

为了安全起见,我把签名改为:

A & getA() {return a_;}

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

我不担心a内容的变化。(_a.age=4)。我担心要设置的调用,并且我在调用程序中的"a"将是非法的

你需要更加小心你在听谁的。只有当临时对象立即绑定到const引用时,某个对象的生存期才会延长。例如,像这样:

Foo bar() { return Foo(); }
int main()
{
    Foo const & f = bar();
    /* stuff */
} // the object referred to by f is extended till here

你的情况完全不是那样的。特别是,返回const引用的不会创建临时对象,因此这里没有延长生命的内容。特别是,下面的肯定是错误:

A const & bar() { Foo x; return x.getA(); }
int main()
{
    A const & a = bar(); // dangling reference; object dies upon return from Foo::getA()
}