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 也是安全的foo 在我调用 getA 后立即完成,但是提出了很多反对它的论点,所以我觉得这是不正确的。

我想安全起见,所以我将签名更改为:

A & getA() {return a_;}

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

我不担心 a_ 内容的变化。(_a.age =4) 。我担心呼叫设置并且我在呼叫者中的“a”将是非法的

4

1 回答 1

7

你需要更加小心你听谁的。如果临时对象立即绑定到 const 引用,则唯一一次延长某物的生命周期。例如,像这样:

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 回答