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

标签 pointers casting d const-correctness const-cast

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

相关文章:

将指针作为参数传递给引用时的 C++ 指针转换

c - 段错误,分配给c中的双指针

c++ - 将 char 数组传递给 C++ 中的函数时的不同行为

c - 使用结构传输变量

sockets - 等效于 D 中套接字的 poll() 或 WSAPoll()

windows - D编程语言——无需按回车键输入

c# - 如何在 C# 中转换存储在 session 中的字典?

c# - 转换 WebMatrix DynamicRecord 或检索底层 IDictionary<string,object>

java - JLS 与类型转换相关

templates - D 中的结构体和元组模板参数