C++ 如何解决这个问题?非常量引用必须绑定到左值
基类指针的引用不能绑定到派生类poinerC++ 如何解决这个问题?非常量引用必须绑定到左值,c++,C++,基类指针的引用不能绑定到派生类poiner class base { }; class derived : public base { }; int main() { derived va; derived *p = &va; base * &rp = (base*)p; //wrong, non-const reference must bind to lvalue return 0; } 你可能想这样做 base& rp
class base
{
};
class derived : public base
{
};
int main()
{
derived va;
derived *p = &va;
base * &rp = (base*)p; //wrong, non-const reference must bind to lvalue
return 0;
}
你可能想这样做
base& rp = *p;
base* rp = (base*)p;
或者,如果您确实希望引用指针,可以这样做:
base* tmp = p;
base*& rp = tmp;
基类指针的引用不能绑定到派生类poiner
class base
{
};
class derived : public base
{
};
int main()
{
derived va;
derived *p = &va;
base * &rp = (base*)p; //wrong, non-const reference must bind to lvalue
return 0;
}
不可能。但是,您所做的是尝试将base类指针引用绑定到临时base类指针(右值)。但由于它是一个非常量引用,因此无法绑定到右值
根据你的意图,你有两个选择。使用常量引用,它可以绑定到右值。这将延长临时文件的生命周期:
base * const &rp = (base*)p;
或将引用绑定到左值:
base * b = p;
base * &rp = b;
我不确定你是否想这样做
base& rp = *p;
base* rp = (base*)p;
非常量左值引用只能绑定到左值,但是
(base*)p
与写入int&x=1是一个右值错误代码>为什么(基*)p为右值?cast是否将对象更改为临时对象?是的,它使一个临时对象的类型为base*
从p
初始化。请注意“对象”的含义。有一个派生的实例(在堆栈上)和两个(或更多)指向它的指针。指针被强制转换为不同的指针类型,并且没有底层派生的实例的副本或强制转换