关于 string & 作为函数参数的有关问题

关于 string & 作为函数参数的问题
有个函数
foo(string & str){}

调用:
foo(string("hi"));//正确
foo("hi");//错误

第一正确,我理解为临时对象在构造自己的语句结束后才析构,
第二个不知道怎么解释。

------解决方案--------------------
探讨
有个函数
foo(string & str){}

调用:
foo(string("hi"));//正确
foo("hi");//错误

第一正确,我理解为临时对象在构造自己的语句结束后才析构,
第二个不知道怎么解释。

------解决方案--------------------
这当然不是BUG,而是编译器最正确的行为

f("a")

这里的字符串不能被隐式转换成string,而只能是 string const 或者 string const&
因为这里要产生一个临时对象,临时对象的类型在C++里只能匹配“右值引用”,必须是const的,不能被修改。

------解决方案--------------------
foo(string & str){}

foo(string("hi"));//正确
foo("hi");//错误

1."hi" 为常量C风格字符串, string("hi")调用string C风格字符串接受构造函数,创建一个string对象作为函数的实参,所以正确。
2."hi",作为实参,必须能够隐式转换为string对象,而该构造函数定义时加上explicit 关键字避免隐式转换,所以参数类型不符合,会出现错误提醒!
------解决方案--------------------
引用是变量的别名,是指向同一个地址空间,可以改变那个地址空间存储的值,而“hi”的地址空间存储是一个const量,不能修改,如果foo(string & str){}改成foo(const string & str){}就可以;


------解决方案--------------------
探讨
有个函数
foo(string & str){}

调用:
foo(string("hi"));//正确
foo("hi");//错误
这里,"hi"是常量字符数组,怎么能隐式转换为非常量的字符串引用呢?
要修改为这样:
char x[] = "hi";
foo(x);
或者:
foo(const string & str){}


------解决方案--------------------
探讨
引用:
与所有的引用一样,引用形参直接关系到其绑定的对象,而非这些对象的副本

呃,这个我能 理解,不理解的是 当使用string("Hi")最实参时为什么可以呢,
"hi"就不可以, 两个都可以产生临时对象啊,是不是
"hi"隐式产生的是常对象??--正解!hi隐式转换为const string对象,该对象不能传入string 引用,只能传入const string引用

至于foo(string("hi"));为什么正确,一样的道理,不用解释了吧?

------解决方案--------------------
C/C++ code
void fun(string &s)
{
    cout<<s<<endl;
}

void main()
{
    //fun("FUCK YOU WUMAO!");  不能将参数 1 从“const char [7]”转换为“std::string &”
    //因为fun(string &s)函数接受的是string对象的引用 而"FUCK YOU WUMAO!"只是一个常量字符串,不能将其作为实参传递给fun()函数
    fun(string("FUCK YOU WUMAO!"));//这样调用的时候,程序将创建一个临时变量,这样就可以调用fun()函数了,fun()函数
    //将引用创建的临时变量.
}

------解决方案--------------------
foo(string & str){}
意味这传入的队形str必须是可以修改的对象.
foo(string("hi"));//正确
这个传入的实际是以"hi"为默认参数构造的string临时对象.它是可以修改的.故没有问题.

foo("hi");//错误
"hi"自身作为参数输时,它是个常量,在函数中无法完成"修改"的操作,故编译器报错
它类似于如下的错误形式:
const string ss("hi");
foo(ss);