У временных объектов есть область? - PullRequest
7 голосов
/ 24 ноября 2010

Имена имеют scope (свойство времени компиляции), в то время как объекты имеют lifetimes (свойство времени выполнения).Правильно?

Я часто вижу людей, говорящих о временных объектах, "выходящих из области видимости".Но поскольку временный объект не имеет имени, я думаю, что не имеет смысла говорить о «сфере действия» в этом контексте.Время жизни временного объекта очень четко определено и не имеет ничего общего с областью действия.Вы бы согласились?

Ответы [ 5 ]

6 голосов
/ 24 ноября 2010

Имена имеют область действия (свойство времени компиляции),

Да. Я бы не назвал это мыслью о собственности. Но в основном да.

время жизни объектов (свойство времени выполнения). Правильно?

Существует три типа переменных. Каждый тип имеет разные свойства в зависимости от времени жизни.

  • Автоматическая продолжительность хранения:
  • Статическая продолжительность хранения
  • Динамическая продолжительность хранения

Примечание: объекты продолжительности автоматического хранения имеют время жизни, ограниченное областью действия переменной.

Я часто вижу людей, говорящих о временных объектах, "выходящих из области видимости".

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

Но поскольку временный объект не имеет имени, я думаю, что в данном контексте не имеет смысла говорить о «сфере действия».

Технически, да. Но я думаю, что это просто облегчает разговор. Для меня (хотя и не технически правильно) сфера действия временного (не связанного) выражения. Проще сказать, чем срок службы временной переменной.

Время жизни временного объекта очень четко определено и не имеет ничего общего с областью видимости. Вы бы согласились?

Да. Но все еще более естественно говорить о сфере действия (даже если это не технически правильно). Как большинство людей понимают, что вы пытаетесь подразумевать. Но когда вы спускаетесь и говорите об очень технических вещах, вы должны использовать правильную терминологию, а область действия в этом контексте неверна.

4 голосов
/ 24 ноября 2010

Срок службы временных файлов очень мало связан с синтаксическими блоками, но «область» - как слово, а не технический термин - может использоваться другими способами. Важный вопрос заключается в том, путаете ли вы, когда люди используют «область» для обозначения временных. (Похоже, что вы из моего POV.)

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

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

В другом примере часто используется «вызов конструктора», но технически вы не можете вызвать ctor напрямую; вместо этого ctors являются частью инициализации объекта. Вот почему существует явная форма нового исключительно для создания объекта. (Интересно, что вы можете вызвать деструктор напрямую.) Однако я ожидаю, что эта фраза будет понятна в большинстве контекстов, хотя я бы не рекомендовал использовать ее в стандартных контекстах.

1 голос
/ 24 ноября 2010

Я видел, как люди говорили, что «объект вышел из области видимости», когда это означало (на вашем языке) «время жизни объекта закончилось, когда имя объекта вышло из области видимости».Если вы используете эту краткую форму, естественно сказать, что временные объекты тоже выходят за рамки.

0 голосов
/ 24 ноября 2010

Привязка к константной ссылке продлевает время жизни временного элемента до времени жизни ссылки, поэтому в некотором смысле оно имеет какое-то отношение к области действия в данном конкретном случае:

std::string foo();

int main()
{
    // Lifetime of the temporary returned by foo is indeed the scope of bar
    const std::string &bar = foo();
}

См. эту статью от Херба Саттера:

Обычно временный объект сохраняется только до конца полного выражения, в котором он появляется.Однако в C ++ специально указывается, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки и, таким образом, позволяет избежать того, что в противном случае было бы распространенной ошибкой свисающей ссылки.

0 голосов
/ 24 ноября 2010

Временные объекты имеют имена, хотя на них может ссылаться только компилятор. Иначе как компилятор будет ссылаться на них? Тот факт, что вы не можете ссылаться на временный объект после его создания, не означает, что компилятор не может ссылаться на него.

f(Foo(), Bar());

Компилятор должен ссылаться хотя бы на один из временных объектов, даже если вы как программист не можете ссылаться ни на один из них. Временные объекты имеют область действия.

...