A non-const reference is another name for an existing object, so assigning through the reference changes the original value.

lvalue reference An lvalue reference binds to a named object and acts as an alias for that object.
alias Changing the alias changes the original because both names refer to the same storage.

Reference Aliases

score
reference_aliases.cpp
Replay: real traced execution (multi-file project)
#include <iostream>

int main() {
    int score = 40;
    int& alias = score;

    alias += 5;

    std::cout << "score=" << score << std::endl;
    std::cout << "alias=" << alias << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int score = 10;
    int& alias = score;

    alias += 5;

    std::cout << "score=" << score << std::endl;
    std::cout << "alias=" << alias << std::endl;
    return 0;
}
#include <iostream>

int main() {
    int score = 70;
    int& alias = score;

    alias += 5;

    std::cout << "score=" << score << std::endl;
    std::cout << "alias=" << alias << std::endl;
    return 0;
}
  1. score ← 40, alias ← 40

    3int main() {4    int score→ 40 = 40; //@score=10, 705    int& alias→ 40 = score40;67    alias→ 45 += 5;89    std::cout << "score=" << score45 << std::endl;10    std::cout << "alias=" << alias45 << std::endl;11    return 0;12}
    outputscore=45
    alias=45
  1. score ← 10, alias ← 10

    3int main() {4    int score→ 10 = 10;5    int& alias→ 10 = score10;67    alias→ 15 += 5;89    std::cout << "score=" << score15 << std::endl;10    std::cout << "alias=" << alias15 << std::endl;11    return 0;12}
    outputscore=15
    alias=15
  1. score ← 70, alias ← 70

    3int main() {4    int score→ 70 = 70;5    int& alias→ 70 = score70;67    alias→ 75 += 5;89    std::cout << "score=" << score75 << std::endl;10    std::cout << "alias=" << alias75 << std::endl;11    return 0;12}
    outputscore=75
    alias=75