亲爱的朋友们,我担心如果我在以下方法中对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。

看到这是 +运算符,您可能希望返回一个值,而不是对函数内部的变量的引用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top