无法将常量(结构体)类型追加到数组中。

6
在一个结构体 Shape 中,我有一个函数:
...
import graphics.line;

struct Shape {
    Line[] lines;

    void addLine(Line l) {
        lines ~= l;
    }
}

Line也是一个结构体,但是当我将"in Line l"作为addLine()的参数声明时,编译器会出现错误:

shape.d(12): 错误: 无法将类型const(Line)追加到类型Line[]

奇怪的是,在另一个模块中我有一段类似的代码,它可以正常工作... 所以我的问题是,为什么编译器在这种情况下不满意呢?

1个回答

12

基本上,这取决于你的结构体具有哪些成员。 in 存储类别相当于 const scope。因此,写 void addLine(in Line l) 意味着 l 是一个常量。并且由于 const 是 传递性的,所有的 Line l 结构体成员也是 const 的。

然而,Shape 成员 Line[] lines 不是 const 的。所以,你试图将一个 const Line l 添加到一个不是 const 的东西上。这是否可行取决于 struct Line l 的所有成员的类型。如果 所有line 成员具有值(复制)语义,这个添加操作(即赋值操作)是可能的。 如果任何一个成员有(某些)引用语义(例如指针被复制),这个添加操作就不再可能了。否则, 你可以把一个 const Line lc 给到 addLines 中,但会得到一个非常量的 lines 成员。 通过这个方式,你可以改变具有引用语义的值,间接地改变原来的 lc 的值,从而违反了 D 语言中的 const 保证,即常量的传递性。

示例:

class C { }

struct Line {
    int i;
    // int* p;               // if you uncomment this, addLine fails
    // C c;                  // if you uncomment this, addLine fails
}

struct Shape { 
    Line[] lines;
    void addLine(in Line l) { lines ~= l; }
}

void main() { }

编辑: 顺便提一下,另一种使它工作的方式是将 Line[] lines; 改为 const(Line)[] lines;。然后该数组仅包含const元素,并且可以在addLine中附加一个const l


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接