D中的Const / ref问题

时间:2011-08-07 21:49:25

标签: const d

我正在尝试在D中实现自己的范围,而我的.front()方法遇到了问题。

编辑:

我需要返回值为ref

  • 如果我将其设为const,则返回的对象将是副本,这不是我想要的。

  • 如果我使其成为const,那么我就无法在我的范围的.front副本上使用const

我该如何解决这个问题?

struct MyRange(T)
{
    T[] buf;

    @property ref T front() { return this.buf[0]; }  // No error, but not const
    @property ref T front() const { return this.buf[0]; }  // Errors
    @property T front() const { return this.buf[0]; }  // No error, but a copy

    // Can't have all three
}

2 个答案:

答案 0 :(得分:7)

试试这个:

struct MyRange(T)
{
    T[] buf;

    @property ref T front() { return this.buf[0]; }
    @property ref const(T) front() const { return this.buf[0]; }
}

您的示例中的问题是您创建了front const而不是返回的值,并且编译器不会让您转义对const数据的可变引用。

现在,我要指出,一般来说,你不应该期望const范围能够很好地工作。就其本质而言,它们需要是可变的来迭代它们(因为你不能在const范围内调用popFront),所以除了使用{{1}之外你不会做太多事情。 }和front具有const范围。如果你可以隐式地将const范围转换为tail-const范围,那么情况也不会那么糟糕,但是这只适用于数组,并且没有人想出一个使用常规范围的好方法。不幸的是,const范围在这一点上基本没用。

答案 1 :(得分:0)

如果为前端创建单独的setter,该怎么办?

@property T front() const { return this.buf[0]; }//const
@property void front(T t) { this.buf[0]=t; }//allows assign when needed

这是你需要的吗?