Значение "scope" в D (для параметра)
Что делает scope
в
void foo(scope void* p) { }
Значит?
(я говорю не о scope(exit)
или scope int x = 5;
, а о scope
, используемом в списке параметров.)
2 ответа:
Есть 3 использования для
scope
В D.
scope
заявления. Это когда вы используетеscope(success)
,scope(failure)
, илиscope(exit)
. Операторы в следующем блоке выполняются при выходе из области, в которой находится операторscope
, если исключение не было вызвано, если исключение было вызвано, или независимо от того, было ли вызвано исключение для успеха, неудачи и выхода соответственно. Это использованиеscope
остается в языке.
scope
на локальную переменную. Это ставит переменная в стеке-даже если это класс. Объект уничтожается, когда он покидает область видимости. Это использованиеscope
небезопасно и в конечном итоге будет удалено из языка (хотя std.типконы.scoped заменяет его для тех, кто хочет жить опасно).
scope
на параметре функции (который является вариантом использования, о котором вы спрашиваете). При размещении на параметре, который является делегатом, это означает, что ссылки на этот параметр не могут быть экранированы (т. е. глобальная переменная). И когда компилятор видит это на делегатах, он избегает выделения замыкания при получении адреса локальной функции. Это важно в циклахopApply
(ссылка на группу новостей ). В настоящее времяscope
не влияет ни на какие параметры функции, кроме делегатов, и игнорируется для всех других типов, хотя в будущем он может быть расширен или не расширен, чтобы повлиять на типы, такие как указатели, чтобы предотвратить их выход из функция.При использовании в параметре функции ключевое слово
in
является псевдонимом дляconst scope
, что часто является причиной непреднамеренного использованияscope
в параметрах функции.
Поискав в группе новостей digital mars, я нашел два полу-связанных сообщения о scope в этом контексте: здесь и здесь.
Из чтения этих двух сообщений, область действия параметра функции, кажется, не делает ничего полезного, и это там для обратной совместимости. Это даже звучит так, как будто в более поздних версиях после D2 этот квалификатор может быть полностью удален.