引用指针错误:非const左值引用“const * FooBarClass”无法绑定到临时值

时间:2014-09-11 20:41:45

标签: c++ pointers reference const lvalue

FooClass.h:

class FooClass {
    .
    .
    .
    private:
        World *myWorld;
        const Player *&player;
    .
    .
    .
}

FooClass.cpp:

FooClass::FooClass(..., World *w) : myWorld(w), player(w->getPlayer())
{
    .
    .
    .
}

这会触发以下错误:Non-const lvalue reference to type 'const Player *' cannot bind to a temporary of type 'Player *'。然而,类型const Player *的左值显然是一个常数......

3 个答案:

答案 0 :(得分:1)

更改此定义

private:
    World *myWorld;
    const Player *&player;

private:
    World *myWorld;
    const Player * const &player;

这是一个例子

#include <iostream>

struct A
{
    A( const int *p ) : r( p ) {}
    const int * const &r;
};

int * foo()
{
    return new int( 10 );
}

int main() 
{

    A a( foo() );

    std::cout << *a.r << std::endl;

    delete a.r;
}   

答案 1 :(得分:1)

当我们谈论const引用时,我们的意思是它引用的类型是const

const Player *&player;

此声明是参考。但它引用的类型是const吗?不,这不对!它指的是指针,但指针不是const。只是指针指向const的某个东西,但这不会使指针本身const

要将引用绑定到临时值,您需要创建引用const。所以你需要这个:

const Player * const &player;

然而,我无法想象为什么你会想要这个。为什么需要引用getPlayer返回的临时值?当然你只需要一个指针的副本:

const Player* player;

答案 2 :(得分:1)

而不是

const Player *&player;

你需要

const Player * const &player;
               ^^^^^

能够将引用绑定到临时值。

您收到警告

  

将参考成员'播放器'绑定到临时值

因为w->getPlayer()显然是临时的。