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?

Reply via email to