Что означает каретка ('^') в C ++ / CLI?

212

Я только что наткнулся на этот код, и несколько поисков в Google не дают объяснения этому таинственному (для меня) синтаксису.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

Какого черта означает карета? (Это gcnewтакже ново для меня, и я спросил об этом здесь .)

Оуэн
источник
6
Кстати, это произносится как «шляпа» .
kmote

Ответы:

176

Это C ++ / CLI, и символ каретки является управляемым эквивалентом * (указателя), который в терминологии C ++ / CLI называется «дескриптором» «ссылочного типа» (поскольку у вас все еще могут быть неуправляемые указатели).

(Спасибо Aardvark за указание на лучшую терминологию.)

Роб Уокер
источник
5
Синтаксис "&" (я полагаю, "неуправляемая ссылка") все еще существует в C ++ / CLI?
Оуэн
C ++ / CLI является расширением обычного C ++, так что да - это только для неуправляемых ссылок
1800 ИНФОРМАЦИЯ
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

В общем, punctuator %является ^как punctuator &это *. В C ++ унарный &оператор в C ++ / CLI является унарным %оператором.

В то время как &ptrдает урожайность P*, %mngdдает доходность при MO^.

Salomon
источник
1
Я бы скорее сказал, почему бы не ^ mngd вместо * mngd. Это сбивает с толку внезапно позволенное использование символа неуправляемого указателя (*), а не управляемого указателя (^) перед фактической переменной, объявленной в управляемой куче.
swcraft
20

Это означает, что это ссылка на управляемый объект вместо обычного указателя C ++. Объекты, стоящие за такими ссылками, управляются средой выполнения и могут быть перемещены в память. Они также собираются автоматически.

Франси Пенов
источник
17

Когда вы распределяете управляемую память, эта память может перемещаться сборщиком мусора. Оператор ^ - это указатель на управляемую память, который продолжает указывать на правильное место, даже если сборщик мусора перемещает объект, на который он указывает.

Джоэл Коухорн
источник
4

Похоже, что из MSDN каретка означает, что вы получаете указатель на создаваемый тип.

https://web.archive.org/web/20150117095313/http://msdn.microsoft.com/en-us/library/te3ecsc8%28VS.80%29.aspx

Джон Такабери
источник
битая
исправлена ​​ссылка на копию archive.org. Честно говоря, ссылки MSDN настолько хрупки, что все новые ссылки MSDN нужно просто запустить с сайта archive.org с самого начала.
Anssssss
3

В C ++ / CLI это означает управляемый указатель. Вы можете прочитать больше об этом (и других возможностях C ++ / CLI) здесь:

http://en.wikipedia.org/wiki/C%2B%2B/CLI

Марк Инграм
источник
2

Это означает, что это ссылка на управляемый объект.

1800 ИНФОРМАЦИЯ
источник