const Foo getFoo()
と同じです
Foo getFoo() const
不可視のthis
パラメータになりますconst
。はDで推移的であるためconst
、からメンバー変数を返そうとするとthis
、それconst
も同様になります。値型の場合foo
は、それをコピーするだけで、Foo
元の値に影響を与えないため、ミュータブルを返すことは問題になりません。ただしFoo
、はクラスであるため、参照型です。したがって、returningfoo
は、保持しているのとまったく同じオブジェクトへの参照を返しState
ます。コピーは作成されません。そして、それはそうであるに違いありません-そうでなければconst
、パラメータの恒常性に違反することになりthis
ます。
いいえ、捨てることconst
は良い解決策ではありません。この質問で説明したように、Dでは、値をキャストしてからconst
変更することは事実上違法です。これを行うと、型システムに違反することになります。コンパイラーはあなたにそれをさせます、しかしあなたがそうするときあなたがあなた自身の手にあなたの人生を取っているならば。基になるオブジェクトが実際immutable
にある場合は特に悪いです。その場合、セグメンテーション違反が発生する可能性があるためです。どうしてもやらなければならない場合にのみキャストしconst
、自分が何をしているのかを本当に理解していない限り、それを変更することはありません。
いいえ、正しい解決策はリターンタイプを作成することですconst
:
const(Foo) getFoo() const
これで、戻っfoo
て使用できます。ミュータブルが必要な場合は、であるFoo
必要はないかgetFoo
、のコピーを返すconst
必要があります。例えばgetFoo
foo
Foo getFoo() const
{
//This would be cleaner if you provided a clone/dup function
//of some kind on Foo.
auto retval = new Foo;
retval.f = foo.f;
return retval;
}
ここから取り除く重要なことはconst
、Dでは推移的であるということです。ウォルター・ブライトが言うように、「それはずっとカメです」。何かができたらconst
、そのすべての部分がありconst
、自分が何をしているのかを本当に理解していない限り、それを回避するために捨てないでください。したがって、関数からメンバー変数を参照する参照型を返す場合は、戻り型を作成するか、そのコピーを作成してそれを返す必要があります。const
const
const