请考虑以下代码:
class Bar
{
}
class Foo
{
private:
Bar[] bars_;
public:
Bar[] bars() const @property { return bars_.dup; }
}
void
main()
{
auto f = new Foo();
}
目的是拥有Bar
s的只读数组。但是这并没有编译。编译失败,
模板object.dup无法推断功能
如果const
限定符被删除,它编译得很好,但我真的想保留它 - 它确实属于那里。我尝试使用bars_.dup!Bar
代替,但这没有任何改变。我明显做错了 - DMD,LDC和GDC都表现出相同的行为 - 但我无法弄清楚是什么。
答案 0 :(得分:1)
你必须在那里做一些深刻的复制。对于const类,它意味着_bars也是const ...这意味着Bar也是const。它一直是常量。
dup
函数只执行浅拷贝。它使用对内部对象的新引用复制数组,但也不复制对象本身。因此,dup是一个新的可变数组,仍然指向相同的const对象,所以它不允许你将它转换为Bar[]
,只有const(Bar)[]
。
目的是拥有一个只读数组的Bars。
以下是我的表现:
const(Bar[]) bars() const @property { return bars_; }
只需返回现有引用而不复制它,但在返回值上将其标记为const。
带有parens的第一个const包含返回值,下一个const包含this
引用。两者都应该得到你想要的东西。