[英]Returning function-local variable as reference
我找到了這個源代碼:
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
代替?
另一個問題; 為什么之前使用::
scope運算符調用CLSIDFromString
函數? 如果有另一個使用相同名稱聲明的本地函數,這只會有意義,不是嗎?
編號result
是static
局部變量,因此即使在函數退出后它也會存在。 不要將此與非靜態局部變量混淆。
::
in ::CLSIDFromString
告訴編譯器從全局命名空間中選擇CLSIDFromString
,以防在其他命名空間中定義的CLSIDFromString
定義很多,在調用站點可見。
變量是靜態的,所以它會保持活力。 但無論如何它都是愚蠢的代碼,它應該只返回GUID值。 范圍運算符可能是個人對樣式的偏好。
關鍵位是static
關鍵字。 它將result
綁定到函數本身,而不是特定的函數調用。 它在特定的調用返回后繼續存在,因此通過引用返回是安全的。
范圍解析運算符( ::
CLSIDFromString
本身就是在全局命名空間中調用CLSIDFromString
。 也許代碼作者在他自己的命名空間中有另一個版本的函數。 編譯器將告訴您對函數的調用是否不明確,因此您需要添加它。 即使調用也不含糊,它不被有傷害任何東西。
第一個問題 - 局部變量被聲明為靜態,這意味着它的內存緩沖區從一個函數調用保留到另一個函數調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.