关于 string & 作为函数参数的有关问题
关于 string & 作为函数参数的问题
有个函数
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");//错误
第一正确,我理解为临时对象在构造自己的语句结束后才析构,
第二个不知道怎么解释。
------解决方案--------------------
------解决方案--------------------
这当然不是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){}就可以;
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
- 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);