返回函数局部变量作为参考

时间:2011-07-25 13:38:15

标签: c++ static 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

代替?

另一个问题;为什么之前使用CLSIDFromString范围运算符调用::函数?如果有另一个使用相同名称声明的本地函数,这只会有意义吗,不是吗?

4 个答案:

答案 0 :(得分:11)

没有。 resultstatic局部变量,因此即使在函数退出后它也会存在。不要将此与非静态局部变量混淆。

::中的

::CLSIDFromString告诉编译器从全局命名空间中选择CLSIDFromString,以防其他命名空间中定义的CLSIDFromString定义很多,在呼叫现场可见。

答案 1 :(得分:1)

变量是静态的,所以它会保持活力。但无论如何它都是愚蠢的代码,它应该只返回GUID值。范围运算符可能是个人对样式的偏好。

答案 2 :(得分:1)

关键位是static关键字。它将result绑定到函数本身,而不是特定的函数调用。它在特定的调用返回后继续存在,因此通过引用返回是安全的。

范围解析运算符(::)本身就是在全局命名空间中调用CLSIDFromString。也许代码作者在他自己的命名空间中有另一个版本的函数。编译器将告诉您对函数的调用是否不明确,因此您需要添加它。即使呼叫不是不明确,也不会因为在那里而伤害任何东西。

答案 3 :(得分:0)

到你的第一个问题 - 局部变量被声明为静态,这意味着它的内存缓冲区从一个函数调用保存到另一个。