Значение "scope" в D (для параметра)


Что делает scope в

void foo(scope void* p) { }

Значит?

(я говорю не о scope(exit) или scope int x = 5;, а о scope, используемом в списке параметров.)

2 13
d2

2 ответа:

Есть 3 использования для scope В D.

  1. scope заявления. Это когда вы используете scope(success), scope(failure), или scope(exit). Операторы в следующем блоке выполняются при выходе из области, в которой находится оператор scope, если исключение не было вызвано, если исключение было вызвано, или независимо от того, было ли вызвано исключение для успеха, неудачи и выхода соответственно. Это использование scope остается в языке.

  2. scope на локальную переменную. Это ставит переменная в стеке-даже если это класс. Объект уничтожается, когда он покидает область видимости. Это использование scope небезопасно и в конечном итоге будет удалено из языка (хотя std.типконы.scoped заменяет его для тех, кто хочет жить опасно).

  3. scope на параметре функции (который является вариантом использования, о котором вы спрашиваете). При размещении на параметре, который является делегатом, это означает, что ссылки на этот параметр не могут быть экранированы (т. е. глобальная переменная). И когда компилятор видит это на делегатах, он избегает выделения замыкания при получении адреса локальной функции. Это важно в циклах opApply (ссылка на группу новостей ). В настоящее время scope не влияет ни на какие параметры функции, кроме делегатов, и игнорируется для всех других типов, хотя в будущем он может быть расширен или не расширен, чтобы повлиять на типы, такие как указатели, чтобы предотвратить их выход из функция.

При использовании в параметре функции ключевое слово in является псевдонимом для const scope, что часто является причиной непреднамеренного использования scope в параметрах функции.

Поискав в группе новостей digital mars, я нашел два полу-связанных сообщения о scope в этом контексте: здесь и здесь.

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