为什么std.algorithm.fill不接受字符数组?

fwe*_*end 5 d

如果我尝试使用std.algorithm.fill(Range1,Range2)(Range1范围,Range2填充),我会不断收到错误消息,表明找不到模板匹配.看起来编译器试图匹配fill(Range,Value)而不是另一个.

auto test = new char[256];
fill(test, "abc".dup);
Run Code Online (Sandbox Code Playgroud)

是否无法使用填充填充字符数组?

错误

test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))与任何函数模板声明都不匹配

test.d(13):错误:模板std.algorithm.fill(Range,Value)if(isForwardRange!(Range)&&是(typeof(range.front = filler)))不能从参数类型推导出emplate函数!( )(炭[],CHAR [])

Jon*_*vis 8

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始终保证a 是有效字符.charwchar自己,但是,保证有效字符在所有,如果你看到一个人很普遍的错误charwchar使用.多个charswchars经常必须组合以构成单个字符.所以,你无法处理charswchars单独处理.这就是为什么如果你用foreach迭代任何类型的字符串,你应该总是给它的类型dchar.

foreach(dchar c; str)
    ...
Run Code Online (Sandbox Code Playgroud)

如果你没有指定dchar,那么它将是什么字符类型,str除非str是一个数组,否则总是会导致错误dchar,因为你最终会得到代码单元(字符片段)而不是代码点(整个字符) ).只能dchars单独处理.

正是因为所有这些,所有字符串类型和字符数组都被认为是范围dchar,而不管它们的实际元素类型是什么.所以,当你调用popFront一个字符串时,它可能会弹出不仅仅是一个char或更多wchar.如果你打电话front,它可能必须解码多个charswchars返回dchar该字符串中的第一个字符.这意味着,你不能这样对待charwchar阵列为随机访问.第四个字符可能是第四个元素,也可能是第12个元素.无论它从哪个索引开始,它可能是多个代码单元长,所以你不能只是抓取一个随机索引charwchar数组,并期望它是有效的.因此,数组charwchar不是随机访问范围.它们也不是输出范围.

想一想.我们以character '\U00010143'() for instance. It has a code unit length of 4 for UTF-8 and 2 for UTF-16. You can't just fill any random charwchar数组.如果它是一个char数组,并且它的长度不是4的倍数,则last() isn't going to fit. If it's a wchar数组,并且它的长度不是2的倍数,那么它将有同样的问题.因此,使用像filla charwchararray 这样的函数真的不行.

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

算法的数组charwchar工作很好,不需要输出范围或随机访问范围,但它们不适用于那些.对于那些,你需要数组dchar.

  • `removechars`不会改变原始字符串.它正在分配一个新的,所以它可以使它适当的长度,而不必担心改变任何位置,所以它可以使用任何字符类型,而`fill`必须改变传递给它的数组,所以它不能与`char`或`wchar`一起使用. (2认同)