Ответ 1
Я хотел бы указать, что существует большая разница между правилом грамматики с именем StorageClass и семантически классом хранения на этом языке. Правила грамматики связаны с разбором, а не с семантической фазой компиляции.
Прежде всего, TDPL, глава 8, явно относится к классификаторам типов (для которых Уолтер использовал конструктор типа термина). В D только 3 из них:
Уст
неизменная
общий
Все три из них являются частью типа, который они изменяют. Это не относится к классам хранения, таким как ref
.
inout
- это то, что TDPL называет "символом классификатора подстановочных знаков", поэтому он является заполнителем для классификатора типа, а не действительно является типом qualifer или классом хранения.
Теперь, что касается классов хранения или нет, я даю две цитаты из TDPL:
Каждый параметр функции (
base
иexponent
в приведенном выше примере) имеет в дополнение к своему типу дополнительный класс хранения, который определяет способ передачи аргументов функции при вызове.
(со страниц 6 - 7)
Хотя
static
не связан с передачей аргументов функциям, обсуждение этого вопроса является подходящим, потому что, как иref
,static
, применяемое к данным, это класс хранения, что означает указание о деталях относительно того, как данные сохранены.
(со страницы 137)
Кроме того, эта строка относится к классам хранения в C, которая, как представляется, используется довольно немного в объяснениях классов хранения в C, найденных в Интернете:
Класс хранения определяет область видимости и время жизни переменных и/или функций в рамках программы C.
Класс хранения не влияет на тип переменной, как он хранится. К сожалению, я не могу найти точный список классов хранения в D, и люди довольно либеральны с термином класс хранения, используя его, даже если он не применяется. Практически любой атрибут, применяемый к типу save для модификаторов доступа, кажется, называется классом хранения, в зависимости от того, кто говорит. Тем не менее, есть несколько, которые, вне всякого сомнения, являются классами хранения:
enum (при использовании в качестве константы манифеста)
ехЬегп
ленивым
из
исх
сфера
статические
lazy
, out
и ref
могут использоваться для изменения параметров функции и указания того, как они передаются, тогда как enum
и static
используются для указания того, как хранятся переменные (что нигде в случае enum
, поскольку константы манифеста скопированы повсюду, где они используются, а не являются фактическими переменными). extern
влияет на связь.
in
является гибридным, поскольку он является синонимом для scope const
, и хотя scope
является классом хранения, const
является классификатором типов.
В онлайн-документации также упоминаются auto
и synchronized
как классы хранения, хотя я не знаю, на какой основе. auto
похож на inout
на то, что он является заполнителем (в своем случае - заполнителем для типа, а не спецификатором типа) и поэтому не указывает ничего о том, как хранится тип, поэтому я бы не подумал, что это будет класс хранения. synchronized
не изменяет переменные, а классы.
__gshared
, вероятно, также является классом хранения, хотя это немного забавно, поскольку он делает больше или меньше того, что делает shared
(который является классификатором типов), но не является частью этого типа.
Помимо этого, я не знаю. Тот факт, что synchronized
указан как класс хранения, подразумевает, что некоторые из других (например, final
) могут быть, но (например, synchronized
) они не имеют никакого отношения к тому, как переменные хранятся или связаны. Итак, я не знаю, как их можно считать классами хранения.
Я спрошу у группы новостей и посмотрю, смогу ли я получить более окончательный список.
РЕДАКТИРОВАТЬ. Похоже, что нет окончательного официального списка классов хранения в D. Термин используется почти для любого атрибута, используемого в объявлении переменной, который не влияет на его тип (т.е. а не классификатор типа). Похоже, что Уолтер и Андрей склонны уделять большое внимание классификаторам типов, чтобы подчеркнуть, какие атрибуты влияют на тип переменной, но термин класс хранения не был дано нигде почти такого же уровня важности и в конечном итоге используется неофициально, а не по любому строгому определению.