在一个结构中,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.
| 归档时间: |
|
| 查看次数: |
244 次 |
| 最近记录: |