C ++ / SDL «начальное значение ссылки на неконстантное значение должно быть lvalue» - PullRequest
0 голосов
/ 12 октября 2018

У меня есть класс проигрывателя, в котором у меня есть функция для возврата SDL_Rect для размеров и положения моего объекта проигрывателя:

SDL_Rect Player::pos() 
{
    return SDL_Rect { mPosX, mPosY, PLAYER_WIDTH, PLAYER_HEIGHT };
}

Когда я использую это в своей основной программе для рендеринга проигрывателяс:

Renderer::Draw(img, player.pos(), NULL, angle);

я получаю ошибку: «начальное значение ссылки на неконстантное должно быть lvalue», но когда я вместо этого пишу:

SDL_Rect pos = player.pos();
Renderer::Draw(img, pos, NULL, angle);

, это работает.Почему я не могу использовать player.pos () напрямую и использовать другую переменную SLD_Rect?

1 Ответ

0 голосов
/ 12 октября 2018

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:

Краткий ответ: поскольку ссылки на lvalue не могут связывать значения r.

...