C++/SDL"对非const的引用的初始值必须是左值"

Den*_*tho 3 c++ sdl

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

SDL_Rect Player::pos() 
{
    return SDL_Rect { mPosX, mPosY, PLAYER_WIDTH, PLAYER_HEIGHT };
}
Run Code Online (Sandbox Code Playgroud)

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

Renderer::Draw(img, player.pos(), NULL, angle);
Run Code Online (Sandbox Code Playgroud)

我得到错误:"对非const的引用的初始值必须是左值",但当我改为写:

SDL_Rect pos = player.pos();
Renderer::Draw(img, pos, NULL, angle);
Run Code Online (Sandbox Code Playgroud)

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

for*_*818 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
}
Run Code Online (Sandbox Code Playgroud)

如果bar(foo())允许的话,不会发生任何超级糟糕的事情.另一方面,没有理由允许它.bar显式声明它想要修改它的参数,以便在你无法观察到这种修改时允许传递一些东西?

PS:如果您认为这个答案太过简洁,请参考@DanielLangr的评论:

简答:因为左值引用不能绑定rvalues.

  • @Dentho根据我的经验太多`const`没有伤害但是太少了.Imho是一个很好的经验法则,默认情况下声明所有`const`,只有当你知道它需要非const时才删除它 (3认同)