Well, "x" an indeed an "integer constant" from the our point of view: by taking a constant reference, we obligate ourselves not to change the value of "x", we can only read it. However, it does not mean that the value of x has to be constant, it's just that _we_ can't modify the respective memory area through this variable named "x". If it's not a constant actually, then anyone else, or even us, through an other alias can modify the memory area (in this example through the non-const reference to the array), the modified value of course reflecting also when accessing the value of x. So, in this example, "x" is just an alias to the first element of the "arr" array marked const (=you can't modify the value through me), but since the function takes the array by reference (thereby obtaining an alias for the original "arr" array) and changes its first element (remember, the array is a non-const reference, it can be changed), it actually changes the first element of the original, global "arr" array, but "x" is still just an alias for this, thereby its value must be 2 + 2 = 4.