为什么std.algulm.ill不接受字符数组? [英] Why does std.algorithm.fill not accept character arrays?

查看:0
本文介绍了为什么std.algulm.ill不接受字符数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我尝试使用std.algm.ill(Range1,Range2)(Range1 Range,Range2 Fill),我总是收到找不到模板匹配的错误消息。看起来编译器正在尝试与Fill(范围、值)匹配,而不是另一个。

auto test = new char[256];
fill(test, "abc".dup);

不能使用Fill填充字符数组吗?

错误

Test.d(13):错误:模板 Std.algm.ill(Range,Value)if (isForwardRange!(范围)&;&; Is(typeof(range.front=填充)执行 与任何函数模板都不匹配 申报

Test.d(13):错误: 模板 Std.algm.ill(Range,Value)if (isForwardRange!(范围)&;&; Is(typeof(range.front=填充) 无法从推导出嵌入函数 参数类型!()(char[],char[])

推荐答案

std.algorithm.fill接受范围。所有字符串类型都是dchar的范围。这是因为它们都是Unicode。char是UTF-8编码单元wchar是UTF-16编码单元,dchar是UTF-32编码单元。多个代码单元组成一个代码点,这是一个字符。对于UTF-8,一个码位最多可以是6个码元。对于UTF-16,它可能最多为2。对于UTF-32,1个码元始终是1个码点,因此dchar始终保证是有效字符。然而,charwchar本身根本不能保证是有效字符,如果您看到使用了单独的charwchar,这通常是一个错误。多个charswchars通常必须组合成一个字符。因此,您不能单独处理charswchars。这就是为什么如果要使用Foreach迭代任何类型的字符串,始终应将其类型指定为dchar

foreach(dchar c; str)
    ...

如果您没有指定dchar,那么它将是str的任何字符类型,这将不可避免地导致错误,除非strdchar的数组,因为您最终得到的是代码单元(字符片段)而不是代码点(整个字符)。只能单独处理dchars

正因为如此,所有字符串类型和字符数组都被认为是dchar的范围,而不管它们的实际元素类型是什么。因此,当您在一个字符串上调用popFront时,它可能会弹出多个charwchar。如果调用front,它可能必须对多个charswchars进行解码才能返回字符串中的第一个字符dchar。这意味着您不能将charwchar数组视为随机访问。第4个字符可以是第4个元素,也可以是第12个。不管它从哪个索引开始,它都可能是多个代码单元长的,所以您不能只在charwchar数组中抓取一个随机索引并期望它是有效的。因此,charwchar数组是而不是随机访问范围。它们也不是输出范围。

想一想。让我们以'U00010143'(𐅃)为例。UTF-8的码元长度为4,UTF-16的码元长度为2。您不能只用它填充任何随机的charwchar数组。如果它是char数组,并且其长度不是4的倍数,那么最后一个(𐅃)将不适合。如果它是wchar数组,并且它的长度不是2的倍数,那么它也会有同样的问题。因此,在charwchar数组上使用fill这样的函数确实不起作用。

现在,它可以很好地与dchar数组一起工作。由于UTF-32代码单元保证是代码点,数组中的每个字符都是一个元素,它既可以是随机访问范围,也可以是输出范围。因此,如果要将fill这样的函数与字符数组一起使用,则需要使用dchar的数组。您可以使用std.conv.to将其转换为之后需要的字符数组类型,但不能直接填充charwchar的数组。

charwchar数组适用于不需要输出范围或随机访问范围的算法,但它们不适用于这些算法。对于这些,您需要dchar数组。

这篇关于为什么std.algulm.ill不接受字符数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆