在一个结构中,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 []
奇怪的是我在另一个模块中有一段类似的代码,它可以工作......所以我的问题是,为什么编译器在这种情况下不满意呢?
答案 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 l
中addLine
的附加是可能的。