Platform::StringReference
存在,以便您可以将 aconst wchar_t*
跨 ABI 边界传递给接受 a 的函数String^
而无需复制。StringReference
隐式转换为 a ,String^
其内部指针与原始const wchar_t*
. 这由以下代码验证;如果您逐步浏览它,您会发现pz == z
:
void param(String^ s)
{
const wchar_t* z = s->Data();
}
App::App()
{
std::wstring p = L"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz";
const wchar_t* pz = p.c_str();
param(StringReference(pz));
}
但是,尝试返回 aStringReference
似乎并没有以同样的方式工作,我很好奇为什么。如果我有一个返回的函数String^
并从中返回 a StringReference
,则调用相同的隐式转换运算符,但是当调用者获取它们时,String^
它具有包含副本的不同内部数据指针。这是一些尝试它的代码:
String^ ret()
{
std::wstring s = L"12345678901234567890123456789012345678901234567890";
const wchar_t* z = s.c_str();
return StringReference(z);
}
App::App()
{
String^ r = ret();
const wchar_t* rz = r->Data();
}
该代码以两种方式进行验证:首先,如果您逐步执行,您会发现它z != rz
,其次,r
最终指向一个有效字符串而不是垃圾,因此必须制作一个副本,因为原始字符串在ret
.
我也尝试通过 out 参数返回,但我得到与直接返回相同的结果(z != oz
并o
以有效字符串结束):
void out(String^* r)
{
std::wstring s = L"12345678901234567890123456789012345678901234567890";
const wchar_t* z = s.c_str();
*r = StringReference(z);
}
App::App()
{
String^ o;
out(&o);
const wchar_t* oz = o->Data();
}
有没有一种方法可以像StringReference
通过 ABI 边界一样返回一个?我想这种行为将取决于调用者的语言以及该语言如何从 WinRT 编组字符串,但似乎至少 C++/CX 调用者应该能够做到这一点。