我有一个播放器类,其中我有一个函数来返回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变量?
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.