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?