【问题标题】:inout-parameter - replace one const-handle with anotherinout-parameter - 用另一个替换一个 const 句柄
【发布时间】:2013-01-28 10:18:43
【问题描述】:

在一个对象中,我有一个常量句柄数组,指向另一个特定类的某个对象。在一种方法中,我可能希望将其中一个句柄作为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-items 的某种视图。我是来自 C++ 的 D 新手。我是否搞砸了 D-way 中的 const 正确性?我已经尝试了几种方法来让它工作,但不知道如何让它正确。

在没有“邪恶”强制转换的情况下执行此查找的正确方法是什么?

【问题讨论】:

    标签: pointers casting d const-correctness const-cast


    【解决方案1】:

    抛弃const 并修改元素在D 中是未定义的行为。不要这样做。一旦某个东西是const,它就是const。如果数组的元素是const,则不能更改。因此,如果您有const(A)[],那么您可以将元素附加到数组(因为它是const 的元素,而不是数组本身),但您不能更改数组中的任何元素。 immutable 也一样。例如,stringimmutable(char)[] 的别名,这就是为什么您可以附加到string,但您不能更改它的任何元素。

    如果您想要一个 const 对象数组,您可以在其中更改数组中的元素,则需要另一个级别的间接。在结构的情况下,您可以使用指针:

    const(S)*[] arr;
    

    但这不适用于类,因为如果C 是一个类,那么C* 指向一个类对象的引用,而不是对象本身。对于课程,您需要这样做

    Rebindable!(const C) arr;
    

    Rebindable 在 std.typecons 中。

    【讨论】:

    • 抛弃 const 是我最后的选择,即使它是已定义的行为。在此之前,我已经完全删除了 const。但是,在我找到Rebindable(.. 或至少几天)的可接受解决方案之前,这已经是很长时间了。谢谢!
    • 只有当您阅读提及它的文章或此类问题的答案时,您可能才会知道这种事情。但是由于 D 的类型系统是如何工作的,你几乎必须有类似 Rebindable 的东西来创建一个类 const 但它的引用不是 const - 类型系统根本没有任何区别的概念两者之间。 Rebindable 很好地解决了这个问题,但是由于大多数人无法理解为什么他们不能用语言本身来解决问题,所以大多数人不会想到这种事情。
    猜你喜欢
    • 2019-09-24
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多