я читаю страница Википедии о ссылках.
Он содержит следующий код:
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 не перестает существовать. Любое объяснение приветствуется.
Причиной ошибки является то, что сообщение увеличивается 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.
Преинкремент (++i
) выполняет приращение, а затем возвращает ссылку на переменную (которая была изменена). Postincrement (i ++) вычисляет результат приращения, сохраняет его во временной локальной переменной и возвращает копию этого результата после выполнения приращения. Это сделано для того, чтобы убедиться, что приращение выполняется после вызова:
int operator++(int)
{
int tmp( *this );
++(*this);
return tmp;
}
Этот код предназначен для целей обучения, а не является реальным кодом (int не является классом). Для того, чтобы показать, как работает postincrement.
Итак, как вы можете видеть, i++
возвращает копию, а не ссылку. Таким образом, вы не можете инициализировать возвращаемое значение, потому что это значение, а не ссылка на существующую переменную.
Вы можете попробовать увеличить x перед возвратом и посмотреть, решит ли это проблему
int& preinc(int& x)
{
x++;
return x; // "return x++;" would have been wrong
}