Функции возврата ссылочного типа и постфиксный инкремент

я читаю страница Википедии о ссылках.

Он содержит следующий код:

int& preinc(int& x)
{
return ++x;  // "return x++;" would have been wrong
}

preinc(y) = 5; // same as ++y, y = 5

Я пытался скомпилировать с помощью return x++; вместо return ++x;, Как и предполагалось, это привело к следующей ошибке:

ошибка: неверная инициализация неконстантной ссылки типа ‘int&»
из временного типа «int»

Я не понимаю эту ошибку. У меня есть смутная интуиция, что увеличение x происходит слишком поздно (т.е. после завершения вызова функции preinc). Однако я не понимаю, как это проблема, поскольку переменная x не перестает существовать. Любое объяснение приветствуется.

3

Решение

Причиной ошибки является то, что сообщение увеличивается x++ возвращает временное значение, и оно не может быть связано с неконстантной ссылкой lvalue. Это упрощенная версия той же проблемы:

int i = 42;
int& j = i++; // Error: i++ returns temporary value, then increments i.
const int& k = i++; // OK, const reference can bind to temporary.
7

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

Преинкремент (++i) выполняет приращение, а затем возвращает ссылку на переменную (которая была изменена). Postincrement (i ++) вычисляет результат приращения, сохраняет его во временной локальной переменной и возвращает копию этого результата после выполнения приращения. Это сделано для того, чтобы убедиться, что приращение выполняется после вызова:

int operator++(int)
{
int tmp( *this );
++(*this);
return tmp;
}

Этот код предназначен для целей обучения, а не является реальным кодом (int не является классом). Для того, чтобы показать, как работает postincrement.

Итак, как вы можете видеть, i++ возвращает копию, а не ссылку. Таким образом, вы не можете инициализировать возвращаемое значение, потому что это значение, а не ссылка на существующую переменную.

0

Вы можете попробовать увеличить x перед возвратом и посмотреть, решит ли это проблему

int& preinc(int& x)
{
x++;
return x;  // "return x++;" would have been wrong

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