D-';dup无法推断函数';在内部使用时';常数';财产

D-';dup无法推断函数';在内部使用时';常数';财产,d,D,考虑以下代码: class Bar { } class Foo { private: Bar[] bars_; public: Bar[] bars() const @property { return bars_.dup; } } void main() { auto f = new Foo(); } 其目的是拥有一个只读的Bars数组。然而,这并不编译。编译失败,原因是 template object.dup无法推断函数 如果co

考虑以下代码:

class Bar
{
}
class Foo
{
    private: 
        Bar[] bars_;
    public:
        Bar[] bars() const @property { return bars_.dup; }
}
void 
main()
{
    auto f = new Foo();
}
其目的是拥有一个只读的
Bar
s数组。然而,这并不编译。编译失败,原因是

template object.dup无法推断函数


如果
const
限定符被删除,它编译起来很好,但我真的想保留它-它确实属于那里。我试过使用
bar\uu.dup!而是条形码,但这不会改变什么。我显然做错了什么——DMD、LDC和GDC都表现出相同的行为——但我不知道是什么。

你必须在那里做一些深度复制。对于const类,它意味着_bar也是const。。。这意味着酒吧也是常量。一路上都是康斯特

dup
功能仅进行浅拷贝。它使用对内部对象的新引用复制数组,但不会复制对象本身。因此,dup虽然是一个新的可变数组,但仍然指向相同的常量对象,因此它不允许您将其强制转换为
Bar[]
,只允许
const(Bar)[]

其目的是拥有一个只读的条数组

我是这样做的:

const(Bar[]) bars() const @property { return bars_; }
只返回现有引用而不复制它,但在返回值上标记为const

带参数的第一个常量包含返回值,下一个常量包含
引用。有了这两个,你应该得到你想要的