string
es un alias para immutable(char)[]
, es decir, una porción mutable de caracteres inmutables. bar
en su código es una porción de matriz de este tipo.
La relación entre const(char)*
y de cadena literales en D es sólo que los literales de cadena son siempre terminada en nulo, y escriben ya sea como immutable(char)[]
(es decir string
), o immutable(char)*
para la interoperabilidad conveniente con el código de C; el último es implícitamente convertible a const(char)*
. Es importante tener en cuenta que esto es sólo el caso de literales de cadena: matrices no están necesariamente terminada en nulo en el caso general, y no son convertir implícitamente a su equivalente puntero (aunque el miembro .ptr
de cualquier rebanada T[]
es de escriba T*
y apunta al primer elemento del sector).
Los operadores de concatenación trabajan con matrices, así como tipos definidos por el usuario con las sobrecargas de operador relevantes, y nada más. Como D no permite la sobrecarga de operadores para tipos incorporados, no es posible hacer que funcionen con punteros.
La solución es hacer que una porción de la cadena el puntero apunta a, utilizando el operador de parte que trabaja en arreglos y apuntadores por igual:
import core.stdc.string : strlen;
string bar = "Hello ";
const(char)* foo = "world!";
bar ~= foo[0 .. strlen(foo)];
En lo anterior, la expresión foo[0 .. strlen(foo)]
es de tipo const(char)[]
, que puede concatenarse con bar
, que es del tipo immutable(char)[]
(es decir, string
).
Cortar 'foo' no te da una' cadena', sino 'const (char) []'. Todavía es compatible para la concatenación con 'string bar', pero obtendría un error si intentara almacenar el resultado de cortar' foo' en una variable 'string'. –
@jA_cOp: Bien visto, lo arreglaré. –
¿La cadena termina en nulo en la memoria, o debería escribir bar ~ = foo [0..strlen (foo) +1]; en la última línea para C interoperabilidad? –