为什么 *&x 与 x 不一样?

发布于 2024-12-09 00:04:29 字数 644 浏览 1 评论 0原文

简短版本:

以下代码无法编译:

CComBSTR temp;
CMenu().GetMenuString(0,   temp, 0);

但是可以编译:

CComBSTR temp;
CMenu().GetMenuString(0, *&temp, 0);

为什么?


完整代码:

#include <atlbase.h>
extern CComModule _Module;
#include <atlapp.h>
#include <atlwin.h>
#include <atlctrls.h>

int main() {
    CComBSTR temp;
    CMenu().GetMenuString(0, *&temp, 0);
}

GetMenuString 签名(来自 atluser.h,来自 WTL):

BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const;

Short version:

The following code doesn't compile:

CComBSTR temp;
CMenu().GetMenuString(0,   temp, 0);

but this does:

CComBSTR temp;
CMenu().GetMenuString(0, *&temp, 0);

Why?


Full code:

#include <atlbase.h>
extern CComModule _Module;
#include <atlapp.h>
#include <atlwin.h>
#include <atlctrls.h>

int main() {
    CComBSTR temp;
    CMenu().GetMenuString(0, *&temp, 0);
}

GetMenuString signature (from atluser.h, from WTL):

BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

戒ㄋ 2024-12-16 00:04:29

因为一元运算符 &* 可以重载,我猜 CComBSTR 会重载。

* 更新:*

对于那些想知道如何获取类型已重载 operator& 的变量的地址的人,可以参考 TR1 的 std::addressof ,以及它的 Boost 实现以实现 C++03 兼容性。

Because the unary operators & and * can be overloaded, which I guess CComBSTR does.

* Update: *

For those who wonder how to get the address of a variable whose type has overloaded operator& there is TR1's std::addressof, and a Boost implementation of it for C++03 compatibility.

终弃我 2024-12-16 00:04:29

CComBSTR 可能已重载 operator *operator & 以返回与 GetMenuString()< 接收的参数类型相匹配的类型/code>

因此,虽然对于内置数据类型,*&xx 相同,但对于用户定义类型来说,它可能不同。

CComBSTR might have overloaded the operator * or operator & to return a type which matches the parameter type received by GetMenuString()

So while *&x is same as x for built-in data types, it may not be the same for user defined types.

半仙 2024-12-16 00:04:29

CComBSTR 上的 operator& 已重载并返回 BSTR*,因此取消引用它可以为您提供所需的类型,即 BSTR< /代码>。

operator& on CComBSTR is overloaded and returns a BSTR*, so dereferencing it gives you the type you need, i.e. a BSTR.

秉烛思 2024-12-16 00:04:29

如果它不能编译,那么你应该有一个有意义的错误消息?

该函数定义如下,想要BSTR&

BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const

CComBSTR类不会强制转换为BSTR&本身,而是通过&运算符 后跟* 运算符 确实如此。

If it does not compile, then you should have a meaningful error message?

The function is defined as follows and wants BSTR&:

BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const

CComBSTR class does not cast to BSTR& itself, but through & operator followed by * operator it does.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文