返回函数局部变量作为引用
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
?
还有一个问题;为什么CLSIDFromString
函数与::
作用域操作符之前调用?这只有在另一个局部函数用相同的名字声明时才有意义,不是吗?
No。result
是static
局部变量,因此即使在函数退出后它仍然存在。不要将它与非静态局部变量混淆。
::CLSIDFromString
中的 ::
告诉编译器从全局命名空间中选择CLSIDFromString
,以防在调用站点中可以看到在其他命名空间中定义了许多CLSIDFromString
的定义。
该变量是静态的,因此它将保持有效。不过这是愚蠢的代码,它应该按值返回GUID。
密钥位为static
关键字。它将result
绑定到函数本身,而不是特定的函数调用。它在一个特定的调用返回后继续存在,因此通过引用返回是安全的。
作用域解析操作符(::
)本身在全局命名空间中调用CLSIDFromString
。也许代码作者在自己的名称空间中有该函数的另一个版本。编译器会告诉您对函数的调用是否有歧义,因此您需要添加它。即使调用不是二义性的,它在那里也不会伤害任何东西。
回答你的第一个问题——局部变量被声明为静态,这意味着它的内存缓冲区从一个函数调用到另一个函数调用是保留的。
相关文章:
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 返回对局部变量 - C++ 的引用
- 警告 C4101 未引用的局部变量
- 现代编译器会优化只引用对象子集的局部变量吗
- 右值引用和局部变量的移动
- 结构数组 - 未引用的局部变量
- 返回对局部变量的引用是否正常工作?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 三元运算符:编译器不发出局部变量警告的返回引用
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 变量循环范围会导致返回局部变量的地址引用
- 通过引用返回局部变量
- 为什么我得到未引用的局部变量
- 返回由引用指定的引用局部变量
- 返回静态局部变量作为引用
- 从函数中引用局部变量不会给出错误
- C++按引用局部变量传递
- 为什么可以通过引用局部变量而不是临时变量来返回函数?c++
- 捕获带有未引用局部变量警告的异常
- c++11时间非引用局部变量