我找到了这个源代码:
inline GUID& WString2Guid(wstring src)
{
static GUID result;
HRESULT hr = ::CLSIDFromString(W2OLE(const_cast<WCHAR*>(src.c_str())), &result);
if (FAILED(hr)) {
//ERROR: The string '%s' is not formatted as a GUID!
throw(E_INVALIDARG);
}
return result;
}
在这里返回引用有什么用?调用代码无论如何都无法获得引用,因为该变量将在那时离开其范围。那么这个小&
符号会有什么不同吗?
澄清/扩展问题:在同一个示例程序中,该函数被称为
GUID guid = WString2Guid(id); // way 1
如果我想使用该引用,我不必调用
GUID& guid = WString2Guid(id); // way 2
代替?
另一个问题;为什么之前使用CLSIDFromString
范围运算符调用::
函数?如果有另一个使用相同名称声明的本地函数,这只会有意义吗,不是吗?
答案 0 :(得分:11)
没有。 result
是static
局部变量,因此即使在函数退出后它也会存在。不要将此与非静态局部变量混淆。
::
中的 ::CLSIDFromString
告诉编译器从全局命名空间中选择CLSIDFromString
,以防其他命名空间中定义的CLSIDFromString
定义很多,在呼叫现场可见。
答案 1 :(得分:1)
变量是静态的,所以它会保持活力。但无论如何它都是愚蠢的代码,它应该只返回GUID值。范围运算符可能是个人对样式的偏好。
答案 2 :(得分:1)
关键位是static
关键字。它将result
绑定到函数本身,而不是特定的函数调用。它在特定的调用返回后继续存在,因此通过引用返回是安全的。
范围解析运算符(::
)本身就是在全局命名空间中调用CLSIDFromString
。也许代码作者在他自己的命名空间中有另一个版本的函数。编译器将告诉您对函数的调用是否不明确,因此您需要添加它。即使呼叫不是不明确,也不会因为在那里而伤害任何东西。
答案 3 :(得分:0)
到你的第一个问题 - 局部变量被声明为静态,这意味着它的内存缓冲区从一个函数调用保存到另一个。