我最近想使用std.container.Array并继续创建一个带有getter成员函数的类,该函数从Array类返回一个值.我很快意识到我无法对我的getter进行const限定,因为opIndex是一个可变函数.
我尝试将源代码更改为const-qualify Array.opIndex,并且它构建得很好.但是,std.algorithm中的某些单元测试没有通过,抱怨Array.opIndex的返回值不是左值.
这是Array.opIndex的代码:
ref T opIndex(size_t i)
{
version (assert) if (!_data.refCountedStore.isInitialized) throw new RangeError();
return _data._payload[i];
}
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?为什么它不符合常量?
使容器具有const正确性存在许多问题,因为const它使得它们不能在内部更改任何内容,这与C++不同,mutable只要你确保函数是逻辑上的,你可以制作一些东西.const.IIRC,有些操作在Array理论上可以const但不能归因于它的一些内部工作方式.如果因为那个原因,那些参与其中工作的人并没有做出任何改变const,即使其中有些可能是这样,也不会让我感到惊讶.
至于opIndex,我没有看到任何明显的实现,这是不可能的const,而且它编译的事实暗示它可能有效.但是,如果你这样做,你需要重载它,而不是简单地使那个特定的重载const,或者你将无法分配它 - 这可能是std.algorithm抱怨它.所以,你需要类似的东西
ref T opIndex(size_t i) {...}
ref const(T) opIndex(size_t i) const {...}
Run Code Online (Sandbox Code Playgroud)
所以它仍然可以分配给它 - 例如arr[5] = "foo";- 只要Array不是const.但是,由于许多Array操作不能const归功于它的实现方式,我不知道它的功能是多么有用opIndex const,因为const Array!T即使你做了什么你也会非常有限.可以是每个成员函数const是const.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |