6

编码

string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;

第三行编译失败。为什么?我有什么优雅的选择?

错误输出是Error: cannot append type const(char)* to type string

4

2 回答 2

11

不要使用const(char)*?

string bar = "Hello ";
string foo = "world!";
bar ~= foo;

D 中的字符串文字是 type string,你不应该使用 a const(char)*,除非与 C 代码交互。

D 不允许这种连接的原因是因为const(char)*它不是一个字符串,在任何意义上。D 中的字符串是immutable(char)[](这是alias'd by string)。Aconst(char)*只是一个指向常量字符的指针。与 C 和 C++ 不同,没有隐含的空终止符,因此 D 不能也不会假设存在空终止符。

如果出于某种原因您绝对必须使用 aconst(char)*并且您知道它是空终止的,那么您可以const(char)[]通过切片来制作 a ,然后您可以将其附加到 a string

string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0..strlen(foo)];
于 2012-08-11T12:21:37.623 回答
4

string是 的别名immutable(char)[],即不可变字符的可变切片。bar在您的代码中是这种类型的数组切片。

和 D 中的字符串字面量之间的关系const(char)*只是字符串字面量总是以 null 结尾,并且键入为immutable(char)[](ie string),或者immutable(char)*为了方便与 C 代码的互操作性;后者可隐式转换为const(char)*. 重要的是要注意,这仅适用于字符串文字:在一般情况下,数组不一定以 null 结尾,并且它们不能隐式转换为等效的指针(尽管.ptr任何切片的成员T[]都是类型T*并指向第一个切片的元素)。

连接运算符与数组以及具有相关运算符重载的用户定义类型一起使用,仅此而已。由于 D 不允许为内置类型重载运算符,因此不可能使它们与指针一起使用。

解决方案是通过使用适用于数组和指针的 slice 运算符对指针指向的字符串进行切片:

import core.stdc.string : strlen;

string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0 .. strlen(foo)];

在上面,表达式foo[0 .. strlen(foo)]是类型的const(char)[],它可以与bar类型immutable(char)[](即string)连接。

于 2012-08-11T17:49:09.243 回答