Why is the "in" storage class missing from the ParameterStorageClass enum?

Jonathan M Davis jmdavisProg at gmx.com
Thu Jan 20 19:53:21 PST 2011


On Thursday, January 20, 2011 19:03:09 Andrej Mitrovic wrote:
> import std.stdio;
> import std.traits;
> 
> alias ParameterStorageClassTuple STCTuple;
> alias ParameterStorageClass STC;
> 
> void foo(in int[] x) { /*x[0] = 5; // This would be a compile-time error*/
> } void bar(int[] x) { x[0] = 5; }
> 
> void main()
> {
>     assert(STCTuple!foo[0] == STC.NONE);
>     assert(STCTuple!bar[0] == STC.NONE);
> }
> 
> Someone said that "in" was the default storage class when there is no
> storage class specified for a parameter. But if that is true then how come
> bar can modify the contents of the x parameter? If parameters really have
> "in" as the default storage class, bar's function body would be a compile
> time error, just like foo's is if you uncomment its code. (Yes, I know a
> fat pointer is passed in with both functions. But "in" is supposed to give
> some guarantees as to what you can do with a parameter.)
> 
> So, which part of this am I misunderstanding here?

Umm. in is never the default. in is essentially an alias for const scope. The 
default is non-shared and mutable.

- Jonathan M Davis


More information about the Digitalmars-d mailing list