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