C++ 如何解决这个问题?非常量引用必须绑定到左值

C++ 如何解决这个问题?非常量引用必须绑定到左值,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

基类指针的引用不能绑定到派生类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 = *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
初始化。请注意“对象”的含义。有一个
派生的
实例(在堆栈上)和两个(或更多)指向它的指针。指针被强制转换为不同的指针类型,并且没有底层
派生的
实例的副本或强制转换