Как правильно перегрузить постфиксный оператор приращения?

Есть ли способ изменить этот код, чтобы я не получил предупреждение при компиляции? Кроме того, может ли этот код потенциально привести к 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 ? */

}

2

Решение

Вам необходимо вернуть значение (не ссылку):

A operator++(int) { /*...*/ }

это разрешит предупреждение компилятора, и вы не получите висячую ссылку.

6

Другие решения

Постфиксный оператор не возвращается по ссылке, возвращается по значению:

A operator++(int) {  /* returns a copy */

A copy( *this );         /* allocate a copy on the stack */
++x;

return copy;

}

Обратите внимание, что в вашем коде вы возвращаете ссылка на локальную переменную с неопределенным поведением.

Также обратите внимание, что возвращаемая копия может быть легко удалена компилятором через NRVO (Этот код его довольно NRVO чистые).

2

По вопросам рекламы [email protected]