C++/SDL "initial value of reference to a non-const must be an lvalue"

标签 c++ sdl

我有一个播放器类,其中我有一个函数可以为我的播放器对象的尺寸和位置返回一个 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/

相关文章:

c++ - QT 在 StackView 中排列组件

c++ - QT 概述/教程?

c - OpenGL 着色器编译代码位于何处?

c - 尝试将 SDL_Surface 的大小加倍严重失败

c++ - 对类的私有(private)函数的 undefined reference

c++ - 如何从多个纹理(C++、SDL 2)的一部分创建一个位图?

c++ - SDL2 渲染到纹理

c++ - 创建类对象的 vector 时何时调用构造函数?

c++ - 在C++/OpenCV中绘制频率直方图

c++ - 是否可以在 C++ 中的静态成员方法中调用非静态成员方法?