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

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

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

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.

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

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

}

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

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

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

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

Другие вопросы по тегам