2

我最近想使用 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];
}

我在这里缺少什么吗?为什么它不是 const 限定的?

4

1 回答 1

5

使容器 const 正确存在许多问题,因为const它使它们无法更改其内部的任何内容mutable,这与在 C++ 中不同,在 C++ 中,只要确保函数符合逻辑,就可以制作一些东西const. 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你可以用 a 做的事情也会非常有限const Array!T每个可能的成员函数const都是const.

于 2014-08-18T19:46:09.017 回答