10

のようなコードを書く

struct S
{
    this() // compile-time error
    {
    }
}

というエラーメッセージが表示されます

default constructor for structs only allowed with @disable and no body.

どうして??

4

2 に答える 2

14

これは、最初に予想できるよりもはるかにトリッキーなケースの 1 つです。

D が C++ よりも優れている重要で便利な機能の 1 つは、すべての型 (すべてのユーザー型を含む) に、コンパイル時に評価できるガベージ以外の初期値があることです。として使用されT.init、2 つの重要な使用例があります。

  1. テンプレート制約は T.init 値を使用して、特定の型で特定の操作を実行できるかどうかを確認できます (Kenji Hara のスニペットを引用)。

    template isSomething(T) {
       enum isSomething = is(typeof({
           //T t1;                      // not good if T is nested struct, or has @disable this()
           //T t2 = void; auto x = t2;  // not good if T is non-mutable type
           T t = T.init;                // avoid default construct check
           ...use t...
       }));
    }
    
  2. int i = void構文を明示的に使用しない限り、変数は常に適切に初期化されます。ゴミは不可。

となると、難しい問題が出てきます。T() と T.init が同じであることを保証するか (C++ から来た多くのプログラマーが期待するように)、その保証を簡単に破壊する可能性のあるデフォルトの構築を許可する必要があります。私の知る限り、最初のアプローチがより安全であるという決定が下されましたが、驚くべきことです。

ただし、さまざまな改善が提案されて議論が飛び交っています (たとえば、CTFE 対応のデフォルト コンストラクターを許可するなど)。そのようなスレッドの 1つがごく最近登場しました。

于 2013-05-20T13:19:46.470 に答える