4

在一个对象中,我有一个常量句柄数组,指向另一个特定类的某个对象。在一种方法中,我可能希望将其中一个句柄作为 -inout参数返回。这里作为一个简化的例子:

class A {}

class B {
    const(A) a[];
    this() { 
        a = [new A(), new A(), new A()];
    }

    void assign_const(const(A)* value) const {
        // *value = a[0]; // fails with: Error: cannot modify const expression *value
    }
}
void main() {
    const(A) a;
    B b = new B();
    b.assign_const(&a);
    assert(a == b.a[0]); // fails .. obviously
}

我不想删除原始数组中的 const 。类B意味着对集合常量项的某种视图A。我是来自 C++ 的 D 新手。我是否搞砸了 D-way 中的 const 正确性?我已经尝试了几种方法来让它工作,但不知道如何让它正确。

如何在没有“邪恶”铸造的情况下执行此查找的正确方法?

4

1 回答 1

5

抛弃const和修改元素是 D 中未定义的行为。不要这样做。一旦某事存在const,它就是const。如果数组的元素是const,则不能更改。所以,如果你有const(A)[],那么你可以将元素附加到数组中(因为它是元素,而const不是数组本身),但你不能改变数组中的任何元素。与 相同immutable。例如,stringis 的别名immutable(char)[],这就是为什么您可以附加到 a string,但不能更改其任何元素的原因。

如果您想要一个const可以更改数组中元素的对象数组,则需要另一个级别的间接。对于结构,您可以使用指针:

const(S)*[] arr;

但这不适用于类,因为 ifC是一个类,则C*指向对类对象的引用,而不是指向对象本身。对于课程,你需要做

Rebindable!(const C) arr;

可重新绑定在std.typecons中。

于 2013-02-13T01:52:03.777 回答