2015-04-21 2 views
2

При создании Platform::String^ из строки const char[]; т.е.Платформа :: String^связывается непосредственно с const char []?

auto platformString = ref new Platform::String("MyString"); 

ли связать его непосредственно к компиляции времени const char[N] строки или же она выделит копию ссылаться на?

+1

@EdChum это не C++/CLI, но C++/CX. Да, подумайте, почему они создали еще один синтаксис ... –

+0

@LucasTrzesniewski Jesus, я думал, что они остановились на C++/CLI! Извините, если это глупо, это подсказка здесь, в пространстве имен и/или использовании авто? – EdChum

+0

@EdChum есть два ключа: использование 'ref new' вместо' gcnew' (я думаю, 'gcnew' не подходит, поскольку C++/CX не собирает мусор, а подсчитывается вместо него), и использование 'Platform :: String ^' вместо 'System :: String ^' для C++/CLI. 'auto' также поддерживается в C++/CLI. –

ответ

1

Требуется копия - она ​​должна, так как время жизни Platform::String^ определяется путем подсчета ref, а не с помощью обычных правил жизни C++.

auto greeting = std::make_unique<wchar_t[]>(20); 
wcscpy_s(greeting.get(), 20, L"Hello, World"); 
auto s = ref new Platform::String(greeting.get()); 
greeting.reset(); 

// Still works, even though the original string is gone 
OutputDebugString(s->Data()); 

Если вы посмотрите на файл vccorlib.h в вашем VC включают каталог (например C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ включают), то вы увидите, конструктор, который принимает const ::default::char16* __strArg, в конечном итоге вызывает WindowsCreateString, который берет копию.

+0

Я обновил вопрос, чтобы уточнить, что я говорил о строке времени компиляции. –

+0

Это 'const char *'; вы не можете перегружать, основываясь на буквальности строки. void foo (const char * s); void foo (const char s []); ошибка C2535: 'void foo (const char *)': функция-член уже определена или объявлена –

Смежные вопросы