D - ' dup不能推断功能'在内部使用' const'属性

时间:2017-06-29 16:24:00

标签: d

请考虑以下代码:

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都表现出相同的行为 - 但我无法弄清楚是什么。

1 个答案:

答案 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引用。两者都应该得到你想要的东西。