gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:05:51 25 4
gpt4 key购买 nike

我最近想利用 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 限定的?

最佳答案

使容器常量正确存在许多问题,因为 const使得它们不能改变其内部的任何,这与 C++ 不同,在 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 {...}

这样它仍然可以分配给它 - 例如arr[5] = "foo"; - 只要Array不是const 。然而,由于许多Array的操作不能const由于其实现的工作原理,我不知道创建像 opIndex 这样的函数到底有多大用处? const ,因为您可以使用 const Array!T 做的事情非常有限即使每个成员函数都可以是 constconst .

关于constants - D:为什么 opIndex 在 std.container.Array 类中不是 const 限定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25368993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com