Следовать за. Определена ли обратная ссылка на x ++? - PullRequest
3 голосов
/ 06 марта 2010

Я недавно задал вопрос Поведение return x ++;определены?

Результат был примерно таким, как я ожидал, но заставил меня задуматься о подобной ситуации.

Если бы я написал:

class Foo
{   
  ...   
  int x;   
  int& bar() { return x++; }
};

Где бартеперь возвращает ссылку на int, это поведение определено?Если ответ на предыдущий вопрос является буквально верным, а не просто удобной абстракцией происходящего, может показаться, что вы вернете ссылку на переменную стека, которая будет уничтожена, как только будет выполнен возврат.

Если это просто абстракция, мне было бы интересно узнать, какое поведение на самом деле гарантируется постинкрементом.

Ответы [ 2 ]

5 голосов
/ 06 марта 2010

Нет, вы не можете этого сделать, так как это будет возвращать ссылку на временный.

0 голосов
/ 06 марта 2010

Ваш код приведет к compilation error.Но если вы измените постинкремент на преинкремент, это сработает.Значение x увеличивается, а затем возвращается ссылка на этот измененный x.

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

Из этой статьи блога Visual C ++ о ссылках rvalue

... C ++ не хочет, чтобы вы случайно модифицировали временные файлы....

...