gpt4 book ai didi

pointers - inout-parameter - 用另一个替换一个常量句柄

转载 作者:行者123 更新时间:2023-12-05 01:10:34 26 4
gpt4 key购买 nike

在一个对象中,我有一个指向另一个特定类的某个对象的常量句柄数组。在一个方法中,我可能想将其中一个句柄作为 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 相同.例如,stringimmutable(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com