如何返回可以更改的成员
How to return member that can be changed?
多线程环境。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()
}
相关文章:
- 从私有成员变量的成员方法返回unique_ptr
- 在C++如何从数组中提取成员并返回成员类型的数组?
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 为什么向量的.at()成员函数返回引用而不是迭代器
- 有没有更快的方法从成员函数返回格式化字符串
- 局部堆栈变量成员的返回值优化
- C++ 使用成员函数返回结构体指针属性的值
- 模板类的专门继承使成员函数返回模板类型,而不是继承的类类型
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 成员函数返回成员变量的RVALUE参考
- 从类成员函数返回函数指针
- 类成员函数返回的任意值
- 从成员函数返回提升iterator_range
- 提升侵入性unordered_set静态成员功能返回错误的尺寸类型
- 从基类成员函数返回派生类的实例
- 从 const 成员函数返回 'this' 作为非常量
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- 模板模板从成员函数返回类型
- C++类成员函数返回PyObject*分段错误
- 如何从成员函数返回unique_pointer成员