gpt4 book ai didi

c++ - 为什么在临时对象中传递成员地址有效?

转载 作者:行者123 更新时间:2023-11-28 01:33:28 25 4
gpt4 key购买 nike

考虑以下代码。

struct MyVARIANT
{
VARIANT var_;

MyVARIANT(unsigned uVal) {
VariantInit(&var_);
var_.ulVal = uVal;
var_.vt = VT_UI4;
};

~MyVARIANT() {
VariantClear(&var_);
}

VARIANT* operator&() {
return &var_;
}
};

HRESULT SetValue(VARIANT* val)
{
return S_OK;
}


void foo()
{
SetValue(&MyVARIANT(1u).var_);
// E0158 expression must be an lvalue or a function designator
}

void bar()
{
SetValue(&MyVARIANT(1u));
// Fine
}

有许多 WIN32 API 调用需要 non-const VARIANT* 作为参数类型。因此,当我尝试从我的 VARIANT 包装器传递 VARIANT* 时,我遇到了这个问题。

编译器提示 foo(),因为我通过 operator & 传递了临时对象的数据成员地址,这不是左值。

但是当我覆盖 MyVARIANT::operator& 以传递内部成员的地址时,编译器不会在 bar() 中以这种方式提示。

有什么区别

&MyVARIANT(1u).var_

&MyVARIANT(1u)
// same as MyVARIANT::operator& (&MyVARIANT(1u)) { return &this->var_; }

?

最佳答案

这是合法的,因为 C++ 仅保护您免受已知的风险构造的影响。 &MyVariant(1).var 指针明确指向临时成员。

另一方面,

MyVariant(1)::operator&() 正在调用用户定义的函数。编译器不会猜测该函数的实现;这是给定上下文中的合法调用。

关于c++ - 为什么在临时对象中传递成员地址有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com