在一个对象中,我有一个指向另一个特定类的某个对象的常量句柄数组。在一个方法中,我可能想将其中一个句柄作为 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。类(class)
B
意味着对集合常量 A
的某种看法-项目。我是来自 C++ 的 D 新手。我是否搞砸了 D 方式中的常量正确性?我已经尝试了几种方法来让它工作,但不知道如何正确使用。在没有“邪恶”类型转换的情况下执行此查找的正确方法是什么?
最佳答案
抛弃 const
修改元素是 D 中未定义的行为。不要这样做。一旦某事是 const
,它是 const
.如果数组的元素是 const
,那么就不能改了。所以,如果你有 const(A)[]
,然后您可以将元素附加到数组(因为它是 const
的元素,而不是数组本身),但您不能更改数组中的任何元素。与 immutable
相同.例如,string
是 immutable(char)[]
的别名,这就是为什么您可以附加到 string
,但你不能改变它的任何元素。
如果你想要一个 const
的数组可以更改数组中元素的对象,则需要另一个间接级别。在结构的情况下,您可以使用指针:
const(S)*[] arr;
但这不适用于类,因为如果
C
是一个类,那么 C*
指向对类对象的引用,而不是对象本身。对于类(class),你需要做Rebindable!(const C) arr;
Rebindable在 std.typecons 中。
关于pointers - inout-parameter - 用另一个替换一个常量句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843905/