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 调用者应该能够做到这一点。