关于“引用传递的参数必须加上const”的疑惑,该怎么处理

关于“引用传递的参数必须加上const”的疑惑
在函数有多个值需要输出的时候,我们可以用引用传递实现输出参数。
但Google的C++编程规范对引用参数的使用建议是:“引用传递的参数必须加上const”,通过指针实现输出。
且规范中说引用传递的缺点仅仅是:“容易引起误解,因为引用在语法上是值却拥有指针的语义”。

又有人对我说当引用传递的参数不是内置参数的话,如:
  void fun(std::string &str);
这样的函数在涉及多线程编程时,可能会引起内存泄漏。但我不理解,也不明白上面这个函数跟
  void fun(std::string *str);
的安全性有什么区别。

究竟利用引用传递作输出参数有什么实质的缺点???求说明或详细资料!

------解决方案--------------------
Google的意思是:
void fun(std::string &str);
这样的函数我们很难分清楚str究竟是输入参数还是输出参数。

因此推荐这样写:
1、输入参数
void fun(const std::string &str);
2、输出参数
void fun(std::string *str);

------解决方案--------------------
引用相当于常量指针。
比如形参为std::string &str时,这个引用只是指向对应的实参,也就是实参的别名。
而形参为std::string *str时,str是个指针,可以改变其指向的string变量。
------解决方案--------------------
对于string来说,这里只说string类,

输入参数最好是 string const&

输入/输出参数,最好是 string&

几乎就不会出现string单独作为参数类型的情况。
------解决方案--------------------
没什么不好,如果说是多线程的问题,那是多虑了。因为设计不周全的话,多线程的在任何时候都会发生问题。

因为,用引用的好处,相当于限制了函数对实参进行出乎意料的操作。例如
void foo(string*);

当我传递一个指针进去并执行结束,我不能确定我给定的对象会不会被foo delete掉,即使这个对象不是new出来的
------解决方案--------------------
探讨
可能我说得不够简洁,其实想知道的就是:
用引用传递(特别是非内置类型的情况下)作输出有什么不好???有除易读性以外的理由吗??

------解决方案--------------------
规矩是人定的,但人不能被规矩死。
规定不许随地大小便,也没见谁被大小便憋死过。(^_^)
------解决方案--------------------
是为了方便代码阅读。
------解决方案--------------------
楼上几位说的很清楚了,就是易读性的问题。安全性问题是由多线程本身产生的,与是使用引用还是指针无关