【问题标题】:Cannot append constant (struct) type to array无法将常量(结构)类型附加到数组
【发布时间】:2011-02-16 04:30:32
【问题描述】:

在一个结构中,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[]

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

【问题讨论】:

    标签: arrays constants d


    【解决方案1】:

    基本上,这是否有效取决于您的结构具有哪些成员。 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,但会得到一个非常量成员 的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() { }
    

    编辑:顺便说一句,另一种使其工作的方法是将Line[] lines; 更改为const(Line)[] lines;。数组只包含const 元素,并且可以在addLine 中附加const l

    【讨论】:

      猜你喜欢
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2015-07-02
      相关资源
      最近更新 更多