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?我已经尝试了几种方法让它工作,但不知道如何正确.
如果没有"邪恶"的投射,如何正确执行此查找?
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.