无法将常量(struct)类型附加到数组

时间:2011-02-16 04:30:33

标签: arrays const d

在一个结构中,Shape I有一个函数:

...
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 个答案:

答案 0 :(得分:12)

基本上,这是否有效取决于你的struct有哪些成员。 in 存储类相当于const scope。所以,写作 void addLine(in Line l)表示l是const。因为const是 传递性的,所有Line l结构成员也是const

Shape成员Line[] lines不是const。所以,你正在努力 将const Line l附加到不是const的内容中。不管这是不是 可能取决于struct Line l的所有成员的类型。如果全部 line的成员具有值(复制)语义,这是附加的(这是一个 任务)是可能的。如果任何一个成员具有(某些)引用语义(例如 指针被复制),这种追加不再可能。否则,你 可以将const Line lc赋予addLines,但会获得非const成员 lines。通过这个,您可以使用引用语义更改值, 间接地改变原始lc的值,从而违反了。{ const保证,即const在D中的传递性。

示例:

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() { }

修改:BTW,另一种让它发挥作用的方法是将Line[] lines;更改为const(Line)[] lines;。比数组只包含const元素,并且const laddLine的附加是可能的。