C ++ / SDL“对非常量的引用的初始值必须是左值”

时间:2018-10-12 12:08:11

标签: c++ sdl

我有一个播放器类,其中有一个函数可以为播放器对象的尺寸和位置返回SDL_Rect:

SDL_Rect Player::pos() 
{
    return SDL_Rect { mPosX, mPosY, PLAYER_WIDTH, PLAYER_HEIGHT };
}

当我在主程序中使用它来渲染播放器时:

Renderer::Draw(img, player.pos(), NULL, angle);

我收到错误:“对非const的引用的初始值必须是左值” 但是当我改为写:

SDL_Rect pos = player.pos();
Renderer::Draw(img, pos, NULL, angle);

有效。 为什么我不能直接使用player.pos()而必须使用另一个SLD_Rect变量?

1 个答案:

答案 0 :(得分:5)

Renderer::Draw声明要修改其第二个参数(否则它将是const并且您不会收到该错误),如果您传递了一个临时变量,则修改该参数是没有意义的,并且很可能是一个错误,这就是为什么是禁止的。

考虑以下示例:

int foo() { return 3; }
void bar(int& x) { ++x; }
void moo(const int& x) {}

int main() {
    bar(foo()); // not allowed
    moo(foo()); // ok     

    int x = foo(); 
    bar(x);     // ok, modifies x
}

如果允许bar(foo()),则不会发生任何超级坏事件。另一方面,没有理由允许它。 bar明确声明要修改其参数,因此为什么在您无法观察到该修改的情况下允许通过某些内容?

PS :如果您认为此答案太过花哨,请允许我参考@DanielLangr的评论:

  

简短答案:因为左值引用不能绑定右值。