2017-06-29 46 views
0

考虑下面的代码时“DUP不能推导函数”:d - “内常量”属性时使用的

class Bar 
{ 
} 
class Foo 
{ 
    private: 
     Bar[] bars_; 
    public: 
     Bar[] bars() const @property { return bars_.dup; } 
} 
void 
main() 
{ 
    auto f = new Foo(); 
} 

的目的是为具有Bar秒的只读阵列。但是这不能编译。编译失败

模板object.dup不能推断功能

如果const预选赛中被删除,它编译罚款,但我真的想保持它 - 它不属于那里。我试过用bars_.dup!Bar来代替,但是这没什么变化。我显然做错了事情--DMD,LDC和GDC都显示相同的行为 - 但我无法弄清楚什么。

回答

1

你必须在那里做一些深层复制。对于const类,这意味着_bars也是const ...这意味着Bar也是const。它一直是const的。

dup函数只做一个浅拷贝。它将数组复制到里面的对象的新引用,但不会复制对象本身。所以dup,虽然新鲜的可变数组仍然指向相同的const对象,所以它不会让你把它转换为Bar[],只有const(Bar)[]

意图是有一个只读的酒吧数组。

以下是我会做:

const(Bar[]) bars() const @property { return bars_; } 

而不重复,它只是返回现有的参考,但将其标记常量的返回值。

带parens的第一个const包含返回值,下一个const涵盖this参考。你们俩都应该得到你想要的。