Значение "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 этот квалификатор может быть полностью удален.