gpt4 book ai didi

d - 静态数组是一个正向范围吗?

转载 作者:行者123 更新时间:2023-12-04 03:30:06 25 4
gpt4 key购买 nike

这有效:

int[] a = [ 1, 2, 3, 4 ];
fill(a, 5);

但这不是:
int[4] a = [ 1, 2, 3, 4 ];
fill(a, 5);

我得到这个错误:

Error: template std.algorithm.fill(Range,Value) if (isForwardRange!(Range) && is(typeof(range.front = filler))) does not match any function template declaration



相反,我必须这样做才能使其与静态数组一起使用:
int[4] a = [ 1, 2, 3, 4 ];
fill(a[], 5);

有人可以解释这种行为吗?

最佳答案

否。isForwardRange是静态数组的false,因为它们不是有效的正向范围。它们必须具有有效的frontemptypopFront

范围必须在迭代时进行突变。 popFront从范围中删除第一个元素,从而将范围的长度减少了一个。静态数组不能突变。它们的元素可以,但是不能。

int[5] a;
a.length = 4;

是非法的。因此, popFront无法与静态数组一起使用,因此静态数组不能为范围。

为std.array中的数组声明了 frontemptypopFront,并且 frontempty与静态数组一起使用,因为它们显式采用动态数组(而不是范围),并且当函数采用静态数组时,静态数组可以隐式转换为动态数组动态数组(获取静态数组的一部分)。但是, popFront将不起作用,因为它需要动态数组的 ref。而且,正如我指出的那样,无论 popFront的实现如何, popFront都不能与静态数组一起使用,因为您不能按照范围的要求对静态数组进行突变。

现在,对于 fill,它需要一个正向范围,而不是一个数组。因此,IFTI(隐式函数模板实例化)将尝试并使用静态数组类型(而非动态数组类型)。而且由于 isForwardRange是静态数组的 false,因此 fill无法使用静态数组进行编译。但是,在对静态数组进行切片时,您将传递一个动态数组,其 isForwardRangetrue。因此,它有效。并且因为切片指向相同的元素,并且 fill改变了元素而不是数组,所以静态数组中的元素被 fill改变了。

但是要警惕将静态数组的切片传递给函数。只要静态数组存在,就可以了。但是,一旦静态数组离开作用域,则其任何切片都将无效。因此,做类似的事情
int[] foo()
{
int[5] a = [1, 2, 3, 4, 5]
return find(a[], 3);
}

会非常糟糕。对 a的引用转义了 foo-即其最后3个元素的一部分。

因此,如果要将静态数组的一部分传递给函数,则需要确保没有对该数组的引用转义。 fill应该没问题。

关于d - 静态数组是一个正向范围吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8873265/

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