我正在尝试了解在用户定义的迭代器中使用owned类的寿命。考虑以下代码:

var a = new owned C();
var b = new owned C();
a.i = 2;

forall (a1,b1) in zip(a,b) {
  b1 = a1;
}

forall (a1,b1) in zip(a,b) {
  writeln(a1, " ",b1);
}

class C {
  var i : int;
  iter these() {
    yield 1;
  }

  iter these(param tag : iterKind) where tag==iterKind.leader {
    yield 1;
  }

  iter these(param tag : iterKind, followThis) ref
  where tag==iterKind.follower {
    yield i;
  }
}


编译并运行此代码会出现以下错误

(08:54)$ chpl test.chpl --warn-unstable
(08:54)$ ./test
test.chpl:25: error: attempt to dereference nil
(08:54)$ chpl --version
chpl version 1.19.0 pre-release (2c10dbe)


我不清楚在什么时候在这里上课。如果将deinit替换为owned,则本示例将按预期工作。更有趣的是,将第一个循环更改为

forall (a1,b1) in zip(a.borrow(),b.borrow()) {


允许代码也能正常工作。在什么情况下,参数会自动强制为shared实例?

最佳答案

我很确定这是一个错误。我来看一下


在什么情况下,参数会自动强制为借用实例?


现在,何时:


在其上调用方法时(this参数将是借用的)
当传递给类型为Cborrowed C的参数(含义相同)时。
传递给完全通用的函数参数时。


我不确定是否要保留规则3。但这不是您所要解决的问题-而是问题是一些编译器引入的代码实现了forall语句,而这些代码不带owned值。那是一个错误。

09-28 11:21