我有一个播放器类,其中我有一个函数可以为我的播放器对象的尺寸和位置返回一个 SDL_Rect:
SDL_Rect Player::pos()
{
return SDL_Rect { mPosX, mPosY, PLAYER_WIDTH, PLAYER_HEIGHT };
}
当我在我的主程序中使用它来渲染播放器时:
Renderer::Draw(img, player.pos(), NULL, angle);
我收到错误:“对非常量的引用的初始值必须是左值” 但是当我改为写:
SDL_Rect pos = player.pos();
Renderer::Draw(img, pos, NULL, angle);
它有效。 为什么我不能直接使用 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
}
如果 bar(foo())
被允许,则不会发生任何 super 糟糕的事情。另一方面,没有理由允许它。 bar
明确声明它想要修改其参数,那么当您无法观察到该修改时,为什么允许传递某些内容?
PS:如果你觉得这个答案太过手摇,我可以让你引用@DanielLangr 的评论:
Short answer: Because lvalue references cannot bind rvalues.
关于C++/SDL "initial value of reference to a non-const must be an lvalue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52779227/