2012-04-08 4 views
2

Dでは、immutableは推移的であるため、不変構造の任意のフィールドへの代入は禁止されています。私が理解する限り、不変の構造体変数はと決してが変更されていることが強く保証されています。d2:部分的に既知の構造の不変性

しかし、このようなことを宣言すればどうなりますか?

struct OpaqueData; 
immutable(OpaqueData*) data; 

どのような構造Dに実装し、おそらく間接を持っていないの推移不変性を保証Dすることができますか?

不変クラスの不透明データへのポインタをカプセル化する正しい方法は何ですか?

答えて

5

OpaqueDataのフィールドはわからないので、最初にそのフィールドの内容に割り当てることはできません。

あなたは、もちろん、完全に OpaqueData*値ポイントを離れ immutableをキャスト(Dはあなたにそうする力を与えない)と、生のメモリに割り当てることで、型システムを破ることができる

が、その後、あなたは何を求めていますあなたがこれで終わる問題...あなたがこれをしておらず、あなたのOpaqueDataポインターがimmutableであると尊重した場合は、型修飾子の推移的性質のために決して変更することはできません。

これは実際には、それらの全体のポイントです。これは数学的には健全です。

+0

さて、そうです。私は、Dスコープの**保証**について考えました**変更不可能な構造体ポインタがC関数に渡されたとき。実際には不可能です。少なくとも、不変の構造体ポインタをC関数に渡す前に 'immutable'をキャストして、型システムを破壊する必要があるからです。それを理解するのを手伝ってくれてありがとう。 – toriningen

+0

うん。 Cが持つ最も強いものは 'const'であり、Cはそれをキャストすることができるので、' immutable'データをC関数に渡すと、あなたは自分の運命に慣れています( 'const'と同じですが、なぜなら、Dの 'const'データを変更することはまったく違法であるからです。 C関数が実際に 'const'として扱うならば問題ありませんが、そうでなければ問題は起こります。 –

関連する問題