多线程环境。 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();
在另一个问我有人告诉我的问题 If you return const& it's guaranteed that life time of variable will be prolonged to lifetime of the reference ,所以根据这个我不需要复制值和我安全即使在我调用getA后调用setA on foo,但是很多反对它的论据被araised,所以我觉得这不正确。< / p>
我想保持安全,所以我将签名更改为:
A & getA() {return a_;}
但是编译器仍然警告我已经引用了局部变量。我不明白为什么,因为据我所知(cpp新手),返回值是foo.a的副本,那么问题是什么呢?
我并不担心改变a_内容。(_ a.age = 4)。我担心打电话,打电话中的'a'将是非法的
答案 0 :(得分: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()
}