来自右值的非const引用的初始化无效

时间:2014-03-05 03:26:35

标签: c++ pointers

MyObject& MyObject::operator++(int)
{

MyObject e;
e.setVector(this->vector);

...

return &e;
}

invalid initialization of non-const reference of type 'MyObject&' from an rvalue of type 'MyObject*'
     return &e;
             ^

我不确定它在说什么。它是说e是指针,因为它不是指针。另外,如果你创建了一个指向e地址的指针,它会在括号末尾被删除,指针也会丢失。

3 个答案:

答案 0 :(得分:1)

你是正确的e不是指针,但是&e非常指针。

我有理由确定在使用它之前返回对超出范围的堆栈变量的引用也不是一个好主意。

实现postfix operator++的一般方法是保存当前值以返回它,并使用前缀variant修改*this,例如:

Type& Type::operator++ ()   {   // ++x
    this->addOne();             // whatever you need to do to increment
    return *this;
}
Type Type::operator++ (int) {   // x++
    Type retval (*this);
    ++(*this);
    return retval;
}

特别注意前缀变量将引用返回到当前对象(递增后),而后缀变量返回原始对象的非引用副本 (在递增之前)。

C ++标准中涵盖了这一点。在C++11 13.6 Built-in operators /3

  

对于每个(T, VQ)对,其中T是算术类型,VQvolatile或空,有以下形式的候选运算符函数:

     

VQ T & operator++(VQ T &);

     

T operator++(VQ T &, int);

如果由于某种原因,你无法使用构造函数来复制对象,你仍然可以按照它的方式进行操作(创建本地e并设置它矢量) - 您只需确保返回e(技术上是e副本而不是&e

答案 1 :(得分:1)

您的返回类型为MyObject&,是对(非临时)MyObject对象的引用。但是,您的返回表达式的类型为MyObject*,因为您获得的地址为e

return &e;
       ^

但是,由于伪operator++参数,您的int后缀增量运算符)定义不明确。根据{{​​3}},它应该或多或少地定义为

MyObject MyObject::operator++(int)
{
   MyObject e;
   e.setVector(this->vector);

   ...

   return e;
}

没有返回类型中的引用。

答案 2 :(得分:0)

return &e;更改为return e;。和像

这样的函数一样
void Func(int &a);
不使用Func(&some_int)调用

,并且在return语句中不需要&&e的位置为e,类型为MyObject*

另请注意,MyObject&是对象的引用,而不是副本。您将返回对e的引用,该函数将在函数完成时销毁,因此在您下次使用它时将无效。