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

时间:2013-02-12 23:36:05

标签: 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
}

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

如果没有“邪恶”的投射,执行此查找的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

转换const并修改元素是D中未定义的行为。不要这样做。一旦某事const,它就是const。如果数组的元素是const,则无法更改。所以,如果你有const(A)[],那么你可以将元素附加到数组(因为它是const的元素,而不是数组本身),但是你不能改变元素中的任何元素。阵列。它与immutable相同。例如,stringimmutable(char)[]的别名,这就是为什么你可以追加到string,但你不能改变它的任何元素。

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

const(S)*[] arr;

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

Rebindable!(const C) arr;

Rebindable在std.typecons。