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地址的指针,它会在括号末尾被删除,指针也会丢失。
答案 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
是算术类型,VQ
是volatile
或空,有以下形式的候选运算符函数:
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
的引用,该函数将在函数完成时销毁,因此在您下次使用它时将无效。