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

class Class
{
    immutable int member;

    this(int parameter)
    {
        member = parameter;
        ++member;           // okay
        increment(member);  // compile-time error
    }
}

なぜ++member大丈夫ですが、increment(member)そうではありませんか?両方が同じように動作するべきではありませんか?

4

3 に答える 3

5

おそらくへの参照がincrementではないscopeため、コンストラクターのスコープを超えてエスケープされる可能性があります。これにより、の不変性が損なわmemberれ、コンパイラーはそれが正常であることを確認できません。

(それも機能しないかもしれませんが、機能scopeするはずです。適切に実装されれば、これらのような多くscopeのバグが修正され、興味深い最適化が提供されると思います。そうでない場合は、バグ。)

私は以前に半類似のバグを指摘しましたが、代表者がいます。
Const / immutableには、Dでこのような問題があります。

于 2012-08-08T08:35:35.573 に答える
3

これだったらincrement

int* p;
void increment(ref int i)
{
    p = &i;
}

ええと、あなたは不変データへの可変参照を作成し、型システムを壊しました。

于 2012-08-08T12:22:16.843 に答える
0

私はそれを推測しています

this(int parameter) {
    member = parameter;
    ++member;
}

と同等です

Class(int parameter): member(parameter+1) {}

C++で。

memberフィールドはコンストラクターで本当に変更可能ではないと思うので、コンパイラーはそれを初期化するように最適化できます。ただし、別の関数を呼び出してそれを行うことはできません。

PS。ideoneで動作します:http://ideone.com/5ym5u

于 2012-08-08T10:41:25.447 に答える