代码
string bar = "Hello ";
const(char) * foo = "world!";
bar ~= foo;
无法在第三行编译。为什么?我有什么优雅的替代品?
错误输出为Error: cannot append type const(char)* to type string
。
答案 0 :(得分:11)
不要使用const(char)*
?
string bar = "Hello ";
string foo = "world!";
bar ~= foo;
D中的字符串文字属于string
类型,除了与C代码接口外,您不应该使用const(char)*
。
D不允许连接的原因是因为const(char)*
不是字符串,在任何意义上都是字符串。 D中的字符串为immutable(char)[]
(alias
' d string
)。 const(char)*
只是指向常量字符的指针。与C和C ++不同,没有隐含的空终止符,因此D不能假设有一个。
如果由于某种原因你绝对必须使用const(char)*
并且知道它是空终止的,那么你可以通过切片从中创建一个const(char)[]
,然后,您可以附加到string
:
string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0..strlen(foo)];
答案 1 :(得分:4)
string
是immutable(char)[]
的别名,即可变字符的可变片段。代码中的bar
是此类型的数组切片。
D中const(char)*
和字符串文字之间的关系只是字符串文字始终为空终止,并且输入为immutable(char)[]
(即string
)或immutable(char)*
方便与C代码的互操作性;后者可以隐式转换为const(char)*
。重要的是要注意,这只是字符串文字的情况:在一般情况下,数组不一定是空终止的,并且它们不可以隐式转换为它们的指针等价物(虽然任何切片.ptr
的成员T[]
的类型为T*
,但指向切片的第一个元素。)
连接运算符使用数组以及具有相关运算符重载的用户定义类型,而不是其他任何操作。由于D不允许内置类型的运算符重载,因此无法使它们与指针一起使用。
解决方案是通过使用对数组和指针起作用的切片运算符来制作指针指向的字符串切片:
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
(即{{1}} )。