Definitive list of storage classes

Jakob Ovrum jakobovrum at gmail.com
Sat Apr 14 21:45:38 PDT 2012


On Saturday, 14 April 2012 at 17:50:39 UTC, Jonathan M Davis 
wrote:
> That's clearly not the list, since it includes const, 
> immutable, and shared,
> which are type qualifiers rather than storage classes. It also 
> has stuff like
> init in it, which isn't even vaguely a storage class. All of 
> the storage
> classes may be in that list, but I don't know how you'd figure 
> out which ones
> they are from that list.

Obviously D has inherited the term "storage class" from C and 
C++, but then expanded use of the term to a point where it's not 
always meaningful any more. I agree that the term needs some work.

`const`, `immutable` and `shared` actually can affect the storage 
of variables in specific situations (e.g. an immutable module 
variable declaration), but we know they are also type qualifiers, 
beyond any doubt. I don't think it would be a stretch to say they 
are both storage classes and type qualifiers, and this is in fact 
how the specification presents it.

I personally think that it's meaningless to classify them as both 
and would prefer their storage class classification be dropped 
from the specification text.

>
>> If I had to guess I'd say 'storage class' meant something much 
>> more specific
>> in C than it does in D, where it seems to mean properties of a 
>> declaration
>> that do not affect the type.
>
> Except that both Walter and Andrei seem to talk about type
> qualifiers/constructors and storage classes as if they meant 
> essentially the
> same thing as in C/C++.

If Walter and/or Andrei have made an executive decision about 
what is and what isn't a storage class, I suggest they submit a 
pull request to dlang.org clarifying its new meaning.

I have a feeling not a lot of thought has gone into this issue 
though, and Walter denying that immutable is a storage class (in 
his Lang.NEXT talk) probably means one of two things, 1) 
immutable is not a storage class in the context he presented, or 
2) he was wrong and it is both a storage class and a type 
qualifier/constructor (per the specification).

> TDPL _does_ sort of try and define it, but not really. It 
> pretty much
> just lists certain modifiers as being storage classes without 
> giving a full
> list or explaining exactly what constitutes a storage class. 
> The closest thing
> that it gives to a definition
>
> "Each function parameter (base and exponent in the example 
> above) has, in
> addition to its type, an optional storage class that decides 
> the way that
> arguments are passed to the function when invoked."
>
> would seem indicate that static (which it later says is a 
> storage class) isn't
> a storage class at all, since storage classes would only apply 
> to function
> parameters (which would also disqualify synchronized as a 
> storage class, which
> would be at odds with the online docs).

He is referring to the *parameter storage classes*, and he's 
actually wrong on one point: a parameter can have multiple 
parameter storage classes as long as they are compatible.

List from the specification on functions:
"Parameter storage classes are in, out, ref, lazy, const, 
immutable, shared, inout or scope."

One point of interest is that you can define a function like:

     void foo(const scope int a);

With the `const` before the `scope` like that. This has to be 
taken into consideration if the definition of a storage class is 
to be revisited.

> So, I'd like an official definition of storage class with a 
> list of what qualifies
> as a one in D. But it wouldn't surprise me at all if Walter's 
> the only one who
> can do that.

Anyone making such a list would probably be making rather 
arbitrary on-the-spot decisions if we don't provide a solid 
definition of what a storage class is in D. As long as we have a 
good definition, anyone could fix the lists.


More information about the Digitalmars-d mailing list