簡體   English   中英

返回函數局部變量作為參考

[英]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函數? 如果有另一個使用相同名稱聲明的本地函數,這只會有意義,不是嗎?

編號resultstatic局部變量,因此即使在函數退出后它也會存在。 不要將此與非靜態局部變量混淆。

:: in ::CLSIDFromString告訴編譯器從全局命名空間中選擇CLSIDFromString ,以防在其他命名空間中定義的CLSIDFromString定義很多,在調用站點可見。

變量是靜態的,所以它會保持活力。 但無論如何它都是愚蠢的代碼,它應該只返回GUID值。 范圍運算符可能是個人對樣式的偏好。

關鍵位是static關鍵字。 它將result綁定到函數本身,而不是特定的函數調用。 它在特定的調用返回后繼續存在,因此通過引用返回是安全的。

范圍解析運算符( :: CLSIDFromString本身就是在全局命名空間中調用CLSIDFromString 也許代碼作者在他自己的命名空間中有另一個版本的函數。 編譯器將告訴您對函數的調用是否不明確,因此您需要添加它。 即使調用也不含糊,它不被有傷害任何東西。

第一個問題 - 局部變量被聲明為靜態,這意味着它的內存緩沖區從一個函數調用保留到另一個函數調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM