【问题标题】:Reference to a pointer error: Non-const lvalue reference "const * FooBarClass" cannot bind to a temporary引用指针错误:非常量左值引用“const * FooBarClass”不能绑定到临时
【发布时间】:2014-09-11 20:41:45
【问题描述】:

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 * 类型的左值显然是一个 const 左值...

【问题讨论】:

  • const Player * 是一种类型,而不是左值。无论w->getPlayer() 返回的是Player *

标签: c++ pointers reference constants lvalue


【解决方案1】:

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

const Player *&player;

此声明是一个参考。但它所指的类型是const 吗?不,这不对!它引用了一个指针,但指针不是const。只是碰巧指针指向const,但这并不会使指针本身成为const

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

const Player * const &player;

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

const Player* player;

【讨论】:

  • 如果我的 World 对象中的 Player 出于某种原因发生了变化,我希望 player 成员反映这种变化,所以我需要一个参考不是吗?
  • @acannon828 不!如果复制指针,则原始指针和副本都包含相同的地址。这意味着它们指向同一个对象。无论该对象如何被修改,两个指针都会看到它。
  • 抱歉,我的意思是我的 World 对象中的 Player 是否要更改为不同的 Player 对象。
  • @acannon828 好的,但是您将修改World 内部的指针。但是,getPlayer 正在返回该指针的副本。因此,您的引用将指的是指针的副本,如果您更改 Player 对象,它将不会被修改。听起来您实际上希望 getPlayer 也返回一个引用,然后将非const 引用存储到该返回的指针。然而,对指针的引用总是难闻的(指针本身已经是)。
  • @acannon828 如果您需要查看该指针何时更改,那么您需要对指针的引用,就像您尝试过的那样。您只需要修改getPlayer 以便它也返回对指针的引用。否则,您只是试图引用 getPlayer 返回的副本,这不是您想要的。
【解决方案2】:

改变这个定义

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;
}   

【讨论】:

  • 现在我收到警告Binding reference member 'player' to a temporary value
  • @acannon828 查看我更新的示例。看来您正在返回一个指向局部变量的指针。
  • @acannon828 指针 w 指向的对象可以是本地对象。所以编译器发出警告。我向您展示了使用 operator new 的示例。
【解决方案3】:

代替

const Player *&player;

你需要

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

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

你收到警告

将引用成员'player'绑定到一个临时值

因为显然w-&gt;getPlayer() 是临时返回的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2012-02-25
    • 2019-12-21
    相关资源
    最近更新 更多