Функция, возвращающая статическую переменную C ++ - PullRequest
0 голосов
/ 11 февраля 2012

Я не понимаю, почему следующая программа не так:

 int& getID(){
   static int r = 0;
   return r++;
 }

главный:

 int main(){
   int a = getID();
   std::cout << "a=" << a << std::endl;
   return 0;
 }

Почему возврат статической переменной, как описано, создает проблемы и не возвращает Разыскиваемое значение?

Ответы [ 5 ]

7 голосов
/ 11 февраля 2012

Вы используете постинкремент (r ++ в отличие от ++ r). Результат постинкрементного является временным, и вы пытаетесь вернуть ссылку на этот временный. Вы не можете сделать это. Если вы хотите вернуть ссылку на r, тогда вы можете использовать предварительное увеличение или просто сделать увеличение, а затем в отдельном выражении вернуть r.

2 голосов
/ 11 февраля 2012

То, с чем вы сталкиваетесь, является неопределенным поведением. Все может случиться.

r++ возвращает временное значение, а UB возвращает временные ссылки по ссылке.

На моей платформе, например, он даже не компилируется.

1 голос
/ 11 февраля 2012

Сделайте так, чтобы ваша функция возвращала int, а не int &, и все будет хорошо.Вы хотите вернуть значение нового идентификатора, а не ссылку на внутреннюю часть функции.

1 голос
/ 11 февраля 2012

Он не возвращает ссылку на r, а ссылку на значение r до того, как он был увеличен. И это, вероятно, потеряно в действии.

Попробуйте

r++;
return r;

или

return ++r;
0 голосов
/ 11 февраля 2012

Вы должны прочитать о префиксе и постфиксном операторе и как они реализованы .

В основном, ++i делает это (префикс):

i += 1;
return i;

Иi++ делает (постфикс):

ans = i;
i += 1;
return ans;

Согласно упомянутой странице, только префикс operator++ возвращает ссылку на обновленную переменную.Postfix (i++) возвращает новую переменную.

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