Справочные функции в C ++ - PullRequest
5 голосов
/ 09 июня 2011

У меня есть функция, которая выдает мне ошибку "невозможно преобразовать из 'int' в 'int &'", когда я пытаюсь скомпилировать ее.

int& preinc(int& x) { 
    return x++;
}

Если я заменю x ++ на x, он будеткомпилировать, но я не уверен, как это отличает его.Я думал, что x ++ возвращает x до того, как он увеличит x, поэтому не должен ли «return x ++» быть таким же, как «return x» в отношении того, что возвращает preinc?Если проблема связана с оператором ++, действующим на x, то почему он не выдаст ошибку, если я поставлю строку «x ++» до или после оператора return или заменим x ++ на ++ x?

Ответы [ 3 ]

11 голосов
/ 09 июня 2011

Ваша функция выполняет две функции:

  • Увеличивает x, который вы передаете по ссылке
  • Возвращает ссылку на local результат выражения x++

Ссылка на local недействительна, и возвращение чего-либо из этой функции кажется совершенно излишним.

Следующее исправлено, но я все еще думаю, что есть лучший подход:

int preinc(int& x) {
   return x++; // return by value
}
11 голосов
/ 09 июня 2011

x++ создает временную копию оригинала, увеличивает оригинал и затем возвращает временную.

Поскольку ваша функция возвращает ссылку, вы пытаетесь вернуть ссылку на временную копию, которая является локальной для функции и, следовательно, недействительной.

4 голосов
/ 09 июня 2011

Да, x++ возвращает x до его увеличения.Поэтому он должен возвращать копию, копия является временной, и вы можете передавать временные данные только как постоянные ссылки.

++x, с другой стороны, возвращает оригинал x (хотя и увеличивается), поэтому он будетработать со своей функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...