在构造函数中更改不可变成员

fre*_*low 3 constructor d initialization immutability pass-by-reference

void increment(ref int i)
{
    ++i;
}

class Class
{
    immutable int member;

    this(int parameter)
    {
        member = parameter;
        ++member;           // okay
        increment(member);  // compile-time error
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么++member好,但increment(member)不是吗?这两种行为不应该相同吗?

Meh*_*dad 5

可能是因为引用increment不是scope,所以它有可能被转义超出构造函数的范围,这会破坏其不变性member,并且编译器无法验证它是否正常.

(可能这scope也不会起作用,但它应该是.如果实施得当,我认为scope会解决很多这样的错误,并提供有趣的优化.如果没有,我会说它是一个错误.)

我之前已经指出了半类似的错误,但是与代表们一起.
Const/immutable在D中确实存在这样的问题.