D:为什么opIndex在std.container.Array类中不是const限定的?



我最近想要利用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做的事情也会非常有限。

相关内容

  • 没有找到相关文章

最新更新