2017-02-16 3 views
1

Nullable構造体を配列に追加しようとすると、それをキャストする必要がありますが、インデックスを使用して配列に割り当てるときにはキャストする必要があります。これはバグですか、それともこの方法で動作するはずですか?Nullable型の配列への追加

import std.typecons; 

struct Foo { 
    string s; 
    int i; 
} 

void main() { 
    f1(); 
    f2(); 
    f3(); 
} 

void f1() { 
    auto foos = new Nullable!Foo[](10); 
    foos[0] = Foo("abc", 10); // OK 
} 

void f2() { 
    Nullable!Foo[] foos; 
    foos ~= Foo("abc", 10); // Error: cannot append type Foo to type Nullable!(Foo)[] 
}  

void f3() { 
    Nullable!Foo[] foos; 
    foos ~= cast(Nullable!Foo)Foo("abc", 10); // OK 
} 

答えて

3

これは意図的なことですが、それは理想的ではないと思いますが。 Dは暗黙的な構造を持っていません(本当にあいまいなケースでは、あなたが好奇心であればvariadicクラスの関数を除いています)。そして、あなたが欲しいのは、Nullableの暗黙的な構築です.Fooの場合、Nullableラッパーを作成し、 Dは何らかの明示的なアクション、ディレクターのコンストラクター呼び出し、または*のような役割を果たす関数呼び出しなしでは実行できません(ユーザー定義の配列によっては、オーバーロードされたconcat演算子があなたのために構築を行いますが組み込みの配列を使用しているため、オーバーロードされていません)。

これを割り当てると、すでに作成されたアイテムのNullable!T.opAssignが呼び出されます。内容を置き換えるタイプhttp://dpldocs.info/experimental-docs/std.typecons.Nullable.opAssign.htmlで実装されたオーバーロードされた関数。

しかし、連結は、この構成ルールに当てはまる新しい要素を作成する必要があることを意味します。

私はDがこの機能を持っていたらいいと思うので理想的ではないと言います。 C++は暗黙的なコンストラクタでは悪い経験をしていましたが、それはあなたが明示的にexplicitキーワードを使用していない限り、すべてのC++コンストラクタがデフォルトで暗黙的だったからです。 Dはその間違いを避けたが、風呂で赤ちゃんを投げた:(

S(V)

:値は同じ型の構造体ではないSは、と等価です
関連する問題