c++ 如果想要改变string对象中字符的值,必须把循环变量定义成引用类型

c++primer上的一句话,不能理解为什么必须要用引用,这和用范围for不用引用有什么区别吗?
试了一下,不用引用输出时字符的值确实没有改变,这是什么原理呢,可以解释一下么?
跪求大神啊

不用引用,你循环变量引用的就会是变量的拷贝,就没法修改实际变量

#include
#include
using std::cout;
using std::endl;
using std::string;
int main()
{
string a("abcde!!!!");
for(auto i:a)
i=toupper(i);

cout<<a<<endl;
}

i不是对a的引用,这样的结果不能使a中字符变为大写

#include
#include
using std::cout;
using std::endl;
using std::string;
int main()
{
string a("abcde!!!!");
for(auto i:a)
i=toupper(i);

cout<<a<<endl;
}

i不是对a的引用,这样的结果不能使a中字符变为大写

i在这里跟a里面的字符并不是同一个,只是一份拷贝,
就好像x=y,x++,把y赋予x以后,改变x的值并不能改变y