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

根据我的理解,whenr是一个空范围,array()返回一个null. null在这方面,和空数组之间应该有区别吗?

替换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 编程语言,第 1 页。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 回答