从C ++方法返回引用
-
02-10-2019 - |
题
亲爱的朋友们,我担心如果我在以下方法中对C ++中的参考有糟糕的使用,因为GCC抱怨警告“引用局部变量'我返回”
MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
MatrizEsparsa me(outra.linhas(),outra.colunas());
return me;
}
但是,随着以下警告的变化消失:
MatrizEsparsa& MatrizEsparsa::operator+(MatrizEsparsa& outra){
MatrizEsparsa me(outra.linhas(),outra.colunas());
MatrizEsparsa &ref = me;
return ref;
}
以前的方法(返回'ref'变量)是否可以接受可接受?
解决方案
不。 ref
仍然指的是 me
该电话将在通话结束时被销毁。
您应该返回结果的副本(不以前 &
).
MatrizEsparsa MatrizEsparsa::operator+(const MatrizEsparsa& outra) const {
return MatrizEsparsa(outra.linhas(),outra.colunas());
}
我还添加了两个 const
指定器(参数和方法),因为我怀疑 outra
或在这种情况下需要修改呼叫实例。 (我可能错了,但是你 operator+
会有一个奇怪的语义)
通过做您所做的事情,您只是使代码更加复杂。编译器可能很困惑,无法警告您可能的错误。
通常,当您必须使用巧妙的技巧来做简单的事情时,这意味着有些问题。
其他提示
我认为您正在误解操作员。
有2个:
struct Foo
{
Foo& operator+=(Foo const&);
Foo operator+(Foo const&) const;
};
当您注意到,第一个返回对自身的引用,第二个没有。
另外,通常,第二个应写入免费功能。
Foo operator+(Foo const&, Foo const&);
这可以自动化,因为它很麻烦,使用boost。操作器:
struct Foo: boost::addable<Foo>
{
Foo& operator+=(Foo const& rhs)
{
// add
return *this;
}
};
小 boost::addable
魔术会自动生成 +
基于 Foo::operator+=
.
这是不可接受的。实际上,这是相同的问题:返回对返回方法后将被破坏的本地对象的非核心引用。
不,您必须在这里返回一个值,理想情况下 const
价值。请参阅有效的C ++,项目21。
我建议以下接口:
const MatrizEsparsa operator+(const MatrizEsparsa& left, const MatrizEsparsa& right);
请注意,一切都是 const
参考或 const
价值。返回 const
值并不像返回值或声明参数那样重要 const
参考文献,但是斯科特·迈耶斯(Scott Meyers)的论点使我说服了我,尽管没有人跟随他们。
您无法返回引用,因为您所引用的对象将在您的控制之外销毁。要么将“我”作为MatrizesParsa的成员变量,以便在执行函数后将其持久返回指针,或者指向对象的boost smart_ptr。
看到这是 +运算符,您可能希望返回一个值,而不是对函数内部的变量的引用。