在一个对象中,我有一个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?我已经尝试了几种方法让它工作,但不知道如何正确。
如果没有“邪恶”的投射,执行此查找的正确方法是什么?
答案 0 :(得分:5)
转换const
并修改元素是D中未定义的行为。不要这样做。一旦某事const
,它就是const
。如果数组的元素是const
,则无法更改。所以,如果你有const(A)[]
,那么你可以将元素附加到数组(因为它是const
的元素,而不是数组本身),但是你不能改变元素中的任何元素。阵列。它与immutable
相同。例如,string
是immutable(char)[]
的别名,这就是为什么你可以追加到string
,但你不能改变它的任何元素。
如果您想要一组const
个对象,您可以在其中更改数组中的元素,则需要另一级别的间接。对于结构体,您可以使用指针:
const(S)*[] arr;
但是这不适用于类,因为如果C
是一个类,那么C*
指向对象的引用,而不是对象本身。对于课程,你需要做
Rebindable!(const C) arr;
Rebindable在std.typecons。