我最近想要利用std.container.Array,并着手创建一个带有getter成员函数的类,该函数从Array类返回一个值。我很快意识到我不能const限定我的getter,因为opIndex是一个可变函数。
我尝试将源代码更改为const- qualified 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];
}
我在这里错过了什么吗?为什么它不是const限定的?
使容器const-correct有许多问题,因为const
使得它们不能在内部更改任何,不像在c++中,只要确保函数在逻辑上是const
,您就可以使一些东西mutable
。IIRC, Array
所做的一些操作,理论上可能是const
,但由于它的一些内部工作方式,不能。如果因为这个原因,那些为它工作的人没有把它变成const
,我也不会感到惊讶,即使其中一些可以。
至于opIndex
,我没有看到任何明显的实现不能是const
,它编译的事实意味着它可能工作。然而,如果您这样做,您需要重载它,而不是简单地使特定的重载const
,否则您将无法分配给它-这可能是std.algorithm抱怨的问题。所以你需要像
ref T opIndex(size_t i) {...}
ref const(T) opIndex(size_t i) const {...}
,这样它仍然可以分配给它-例如arr[5] = "foo";
-只要Array
不是const
。然而,由于Array
的许多操作由于其实现的方式而不能成为const
,我不知道使opIndex
这样的函数成为const
有多有用,因为即使每个可以成为const
的成员函数都是const
,您可以用const Array!T
做的事情也会非常有限。