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

Что делает scope в

void foo(scope void* p) { }

означает?

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

Ответы

Ответ 1

Для D scope существует 3 варианта использования.

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

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

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

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

Ответ 2

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

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