Есть ли способ изменить этот код, чтобы я не получил предупреждение при компиляции? Кроме того, может ли этот код потенциально привести к segfault, так как память, к которой он собирается получить доступ для получения значения x в main, была освобождена в конце вызова функции оператора?
class A {
int x; /* value to be post-incremented */
public:
A() { /* default constructor */
}
A( A & toCopy ) { /* copy constructor */
x = toCopy.x;
}
A & operator++(int) { /* returns a reference to A */
A copy( *this ); /* allocate a copy on the stack */
++x;
return copy; /* PROBLEM: returning copy results in a warning */
} /* memory for copy gets deallocated */
}; /* end of class A */
int main() {
A object;
object.x = 5;
cout << (object++).x << endl; /* Possible segfault ? */
}
Вам необходимо вернуть значение (не ссылку):
A operator++(int) { /*...*/ }
это разрешит предупреждение компилятора, и вы не получите висячую ссылку.
Постфиксный оператор не возвращается по ссылке, возвращается по значению:
A operator++(int) { /* returns a copy */
A copy( *this ); /* allocate a copy on the stack */
++x;
return copy;
}
Обратите внимание, что в вашем коде вы возвращаете ссылка на локальную переменную с неопределенным поведением.
Также обратите внимание, что возвращаемая копия может быть легко удалена компилятором через NRVO (Этот код его довольно NRVO чистые).