我有一个播放器类,其中有一个函数可以为播放器对象的尺寸和位置返回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变量?
答案 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的评论:
简短答案:因为左值引用不能绑定右值。