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