Вы путаете сферу и время жизни.Это две взаимосвязанные, но совершенно разные концепции.
Область действия name x
- это область действия класса.Вы можете использовать только неквалифицированное имя x
для члена внутри функций-членов (и некоторых других мелочей, не относящихся здесь) к классу.
время жизни объекта-члена с именем x
такой же, как и вмещающий объект класса.В этом случае время жизни obj.x
совпадает с obj
.Поскольку вы возвращаете ссылку на объект в течение срока его службы, все проверяется.
Причина вашей путаницы может быть в том, что вы узнали, что объекты с автоматическим хранением, например, следующее:
{
int x;
}
Срок их службы ограничен их лексической областью (они могут быть названы только внутри этих фигурных скобок, их области).Но хотя это верно для этих объектов, это не то, что в целом справедливо.Объекты класса могут жить независимо от области их имени (как вы видели).И некоторые объекты могут иметь время жизни, но не иметь области видимости и имени.Обратите внимание:
auto* p = new Foo();
Выражение new
создает объект, но у него нет имени!Так что нет никаких оснований даже говорить о.Здесь p
- имя указателя, а не вновь созданного объекта.