inout-parameter - 将一个const-handle替换为另一个const-handle

Pet*_*der 4 pointers casting d const-correctness const-cast

在一个对象中,我有一个const-handle数组到另一个特定类的某个对象.在方法中,我可能希望将此句柄之一作为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
}
Run Code Online (Sandbox Code Playgroud)

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

如果没有"邪恶"的投射,如何正确执行此查找?

Jon*_*vis 5

const在D中,抛弃和修改元素是未定义的行为.不要这样做.一旦有了什么const,它就是const.如果数组的元素是const,则无法更改.所以,如果你有const(A)[],那么你可以将元素附加到数组(因为它是元素,而const不是数组本身),但是你不能改变数组中的任何元素.它也一样immutable.例如,string是一个别名immutable(char)[],这就是为什么你可以附加到a string,但你不能改变它的任何元素.

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

const(S)*[] arr;
Run Code Online (Sandbox Code Playgroud)

但这不适用于类,因为if C是一个类,然后C*指向对象的引用,而不是对象本身.对于课程,您需要这样做

Rebindable!(const C) arr;
Run Code Online (Sandbox Code Playgroud)

可重新绑定是std.typecons.