2

std.array.arrayコンパイル時に常に機能するように変更しました。次のようになります。

ForeachType!Range[] array(Range)(Range r)
if (isIterable!Range && !isNarrowString!Range)
{
  auto a = appender!(ForeachType!Range[])();
  foreach (e; r)
  {
    a.put(e);
  }
  return a.data;
}

そして使用法:

struct Type
{
  int[] xs;
  this(int[] r) { this.xs = r.array; }
}

enum Type t1 = Type([]);
static if (t1.xs.length) { }  // Error: expression null.length is not constant

私の理解に基づいて、rが空の範囲である場合、はをarray()返しますnullnullこの点で、と空の配列の間に違いがあるはずですか?

に置き換えるreturn a.data;と問題は解決array()するreturn a.data.length ? a.data : [];ので、違いがあると思いますか?

問題は、これはコンストラクターでのみ発生するということです。次の場合、エラーは発生しません。

enum int[] t1 = iota(0,0).array;
static if (t1.length) { }

nullだから私はとの間に違いはないと思い[]ますか?よくわかりません。

4

1 に答える 1

4

[]がと等しいのは本当ですnull[] == null[] is nullは両方trueです。同じことが、初期化された配列または で初期化された配列にも当てはまりますnull

ただし、空の配列が常にであるとは限りませnullん。例えば:

int[] a;
assert(a is null);
a = new int[2];
a = a[0..0];
assert(a !is null);

D プログラミング言語、p.を参照してください。95。

編集: コンパイル時.lengthに誤動作しているように見えるという事実に照らしstd.array.emptyて、比較よりも信頼性の高いチェックに使用することをお勧めしnullます。DMD 2.061 では、失敗したstatic if (!t1.xs.empty) { }場所で動作します。static if (t1.xs.length) { }

于 2013-01-20T21:14:45.657 に答える