考虑以下代码。
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*
从我的变体包装器。
编译器抱怨
foo()
,因为我将临时对象的数据成员的地址传递给
operator &
,不是L值。
但当我超越
MyVARIANT::operator&
为了传递内部成员的地址,编译器不会在
bar()
.
两者有什么区别
&MyVARIANT(1u).var_
和
&MyVARIANT(1u)
// same as MyVARIANT::operator& (&MyVARIANT(1u)) { return &this->var_; }
?