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

lma*_*ing 6 arrays d const

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

...
import graphics.line;

struct Shape {
    Line[] lines;

    void addLine(Line l) {
        lines ~= l;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

ste*_*han 12

基本上,这是否有效取决于结构的成员.该in 存储类相当于const scope.所以,写作 void addLine(in Line l)意味着lconst.由于const是传递性的,所有Line l结构成员const也是.

然而,该Shape成员Line[] lines不是const.所以,你试图追加const Line l一些不是的东西const.这是否可行取决于所有成员的类型struct Line l.如果所有 成员都line具有值(复制)语义,则此附加(这是一个赋值)是可能的.如果任何一个成员具有(某些)引用语义(例如,指针被复制),则此附加不再可能.否则,你可以给一个const Line lc进入addLines,但将获得一个非const成员lines.通过这个,你可以用引用语义改变值lc,也可以间接改变原始值,从而违反 const保证,即constD中的传递性.

例:

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() { }
Run Code Online (Sandbox Code Playgroud)

编辑: BTW,另一种使其工作的方法是Line[] lines;改为const(Line)[] lines;.比数组只包含const元素,并且可以附加const lin addLine.