¿Qué significa el símbolo de intercalación ('^') en C ++ / CLI?

212

Acabo de encontrar este código y algunas búsquedas en Google no muestran ninguna explicación de esta misteriosa (para mí) sintaxis.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

¿Qué diablos significa el caret? (El gcnewtambién es nuevo para mí, y pregunté sobre eso aquí ).

Owen
fuente
66
Por cierto, se pronuncia "sombrero" .
kmote

Respuestas:

176

Esto es C ++ / CLI y el símbolo de intercalación es el equivalente administrado de un * (puntero) que en la terminología de C ++ / CLI se denomina 'identificador' a un 'tipo de referencia' (ya que aún puede tener punteros no administrados).

(Gracias a Aardvark por señalar la mejor terminología).

Rob Walker
fuente
55
¿La sintaxis (supongo "referencia no administrada") "y" todavía existe en C ++ / CLI?
Owen
C ++ / CLI es una extensión de C ++ normal, por lo que sí, solo es para referencias no administradas
1800 INFORMACIÓN
77
// here normal pointer
P* ptr = new P; // usual pointer allocated on heap
P& nat = *ptr; // object on heap bind to native object

//.. here CLI managed 
MO^ mngd = gcnew MO; // allocate on CLI heap
MO% rr = *mngd; // object on CLI heap reference to gc-lvalue

En general, el Punctuator %es ^como el Punctuator &es *. En C ++, el &operador unario está en C ++ / CLI, el %operador unario .

Mientras &ptrproduce a P*, %mngdrinde en MO^.

salomon
fuente
1
Prefiero decir por qué no ^ mngd en lugar de * mngd .. Es confuso de repente usar el símbolo de puntero no administrado (*), no el puntero administrado (^) frente a la variable realmente declarada en el montón administrado.
swcraft
20

Significa que esta es una referencia a un objeto administrado frente a un puntero C ++ normal. Los objetos detrás de tales referencias son administrados por el tiempo de ejecución y se pueden reubicar en la memoria. También se recolectan basura automáticamente.

Franci Penov
fuente
17

Cuando asigna memoria administrada, el recolector de basura puede mover esa memoria. El operador ^ es un puntero para la memoria administrada, que continúa apuntando al lugar correcto incluso si el recolector de basura mueve el objeto al que apunta.

Joel Coehoorn
fuente
2

Significa que es una referencia a un objeto gestionado.

1800 INFORMACIÓN
fuente