Я хотел бы указать, что существует большое различие между правилом грамматики с именем StorageClass и семантически классом хранения на этом языке. Правила грамматики связаны с разбором, а не с семантической фазой компиляции.
Во-первых, TDPL, глава 8, явно относится к классификаторам типов (для которых Уолтер использовал конструктор типа термина). Есть только 3 из них в D:
Const
неизменны
совместно
Все три из них являются частью того типа, который они изменяют. Это не относится к классам хранения, таким как ref
.
inout
- это то, что TDPL называет «символом классификатора подстановочных знаков», поэтому он является заполнителем для классификатора типов, а не действительно является типом qualifer или классом хранения.
Теперь, как к тому, что это классы хранения или нет, я даю две цитаты из TDPL:
Каждый параметр функции (base
и exponent
в приведенном выше примере), имеет, в дополнение к его типу, необязательный класс хранения, который определяет способ передачи аргументов функции при вызове.
(из страниц 6 - 7)
Хотя static
не связанные с передачей параметров в функцию, обсуждать его здесь уместно, потому что, как ref
, static
применяются к данным класс хранения, что означает указание на детали, касающиеся хранения данных.
(со страницы 137)
Кроме того, есть эта линия в отношении классов хранения в C, который, как представляется, usedquite a bit в объяснениях на классах хранения в C найти в Интернете:
класс хранения определяет область видимости и время жизни переменных и/или функций в рамках программы C.
Класс хранения не влияет на тип переменной, как он хранится. К сожалению, я не могу найти точный список классов хранения в D, и люди довольно либеральны с термином класс хранения, используя его, даже если он не применяется. Довольно много любой атрибут, примененный к типу save для модификаторов доступа, кажется, называется классом хранения, в зависимости от того, кто говорит. Тем не менее, есть несколько, которые находятся дальше классы хранения сомнения:
перечислений (при использовании в качестве манифеста константы)
ехЬегп
ленивого
, выполненной
исх
сфера
статической
lazy
, out
и ref
могут использоваться для изменения функции параметры и указать, как они передаются, тогда как enum
и static
используются для указания того, как хранятся переменные (что нигде в случае enum
, поскольку константы манифеста скопированы повсюду, где они используются, а не являются фактическими переменными). extern
влияет на связь.
in
представляет собой гибрид, так как это синоним scope const
, и в то время как scope
класс хранения, const
типа отборочный.
В онлайн-документации также упоминаются auto
и synchronized
как классы хранения, хотя я не знаю, на каком основании. auto
похож на inout
тем, что он является заполнителем (в его случае заполнителем для типа, а не спецификатором типа) и, следовательно, ничего не говорит о том, как хранится тип, поэтому я бы не подумал, что это будет класс хранения. synchronized
не изменяет переменные, а классы.
__gshared
, вероятно, также является классом хранения, хотя это немного смешно, поскольку он делает более или менее то, что делает shared
(что является классификатором типов), но оно не является частью этого типа.
Помимо этого, я не знаю. Тот факт, что synchronized
указан как класс хранения, подразумевает, что некоторые из других (например, final
) могут быть, но (например, synchronized
) они не имеют никакого отношения к тому, как переменные хранятся или связаны. Итак, я не знаю, как их можно считать классами хранения.
Я спрошу у группы новостей и посмотрю, смогу ли я получить более окончательный список.
EDIT: Похоже, что нет определенного официального списка классов хранения в D. Термин используется почти для любого атрибута, используемого в объявлении переменной, который не влияет на его тип (т. Е. Не является классификатором типа). Похоже, что Уолтер и Андрей склонны уделять большое внимание классификаторам типов, чтобы подчеркнуть, какие атрибуты влияют на тип переменной, но термин класс хранения не был дано нигде почти такого же уровня важности и в конечном итоге используется не в соответствии с каким-либо строгим определением.
auto не является заполнителем для типа. Это просто класс non-op starage, который ставится перед декларациями без каких-либо других sc или типов, поэтому компилятор распознает его как объявление и вводит тип. неизменяемый x = 5; работает просто отлично без авто. – Mafi
@Mafi, * фактически *, 'auto' можно рассматривать как класс хранения для переменных стека, как в C и C++. Ключевое слово 'auto' исходит из этого использования, и его семантика * расширена *, чтобы допускать вывод типов переменных без каких-либо других классов хранения; только в этот момент ключевое слово стало использоваться вне локальных переменных. Однако ключевое слово 'auto' было редким зрением перед семантикой вывода типа, и по-прежнему является редким зрелищем на C, поскольку' auto' является классом хранения по умолчанию для локальных переменных. Он называется «авто», потому что это означает «автоматическое время жизни», то есть переменную стека. –