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

zhqyzhqychn 2010-03-18 11:25:20
有个函数
foo(string & str){}

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

第一正确,我理解为临时对象在构造自己的语句结束后才析构,
第二个不知道怎么解释。
...全文
1216 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hm_Qianchao 2012-08-20
  • 打赏
  • 举报
回复
在 linux 上 g++ 测试过,其实两个都是不行,
foo(string("hi"));//错误
foo("hi");//错误
嘎文 2010-03-19
  • 打赏
  • 举报
回复
string("hi")是调用string类的构造函数构造了一个匿名的对象,或者可以认为string将"hi"封装了之后传递给函数做参数,不是强制类型转换,字符串常量是不能强制转换为string的
yangyunzhao 2010-03-19
  • 打赏
  • 举报
回复
必须用const string &
lirg8405 2010-03-19
  • 打赏
  • 举报
回复
foo("hi");
这个是作为一个const char*传递的,不可修改,所以你原来的String&是可修改的,不能传递进去,要能传递的话,修改为const String&,如有说错,敬请指正!
ShineShineRedStar 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 liqianan1987 的回复:]

foo(string & str){}

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

1."hi" 为常量C风格字符串, string("hi")调用string C风格字符串接受构造函数,创建一个string对象作为函数的实参,所以正确。
2."hi",作为实参,必须能够隐式转换为string对象,而该构造函数定义时加上explicit ……
[/Quote]
是这个理,c风格字符串和string确实是两回事。
nscboy 2010-03-19
  • 打赏
  • 举报
回复
foo(string & str){}
意味这传入的队形str必须是可以修改的对象.
foo(string("hi"));//正确
这个传入的实际是以"hi"为默认参数构造的string临时对象.它是可以修改的.故没有问题.

foo("hi");//错误
"hi"自身作为参数输时,它是个常量,在函数中无法完成"修改"的操作,故编译器报错
它类似于如下的错误形式:
const string ss("hi");
foo(ss);
happynxy 2010-03-19
  • 打赏
  • 举报
回复
vc 6.0 对C++标准支持不好,如果想学标准C++的话,还是换了吧。
我觉得string("hi")和"hi"应该都不行吧,因为形参不是const类型。
AlanBruce 2010-03-18
  • 打赏
  • 举报
回复
把一个文字常量传给一个string &是不可以的
cy330206 2010-03-18
  • 打赏
  • 举报
回复
当引用当做函数的形参时,传入的数也要也引用相对应的数据类型。。。
cattycat 2010-03-18
  • 打赏
  • 举报
回复
是生存期的原因。把参数改成const string&应该行。
zhqyzhqychn 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hai040 的回复:]
string("hi")是构造临时对象
按道理也是不能传给引用的
[/Quote]
第一种的对象不也是临时的吗,是生存期差别的原因吗
zhqyzhqychn 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 taodm 的回复:]
楼主用的什么编译器啊?
[/Quote]
vc 6.0
我理解第二种方式也可以隐式的构造出临时对象啊,为什么不行呢,第一种的对象不也是临时的吗
某某9 2010-03-18
  • 打赏
  • 举报
回复
foo(const string & str){}
// 加上const避免复制,直接引用
hai040 2010-03-18
  • 打赏
  • 举报
回复
string("hi")是构造临时对象
按道理也是不能传给引用的
某某9 2010-03-18
  • 打赏
  • 举报
回复
foo(string("hi"));
这是强制转换吧?
linyongzuo 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhqyzhqychn 的回复:]
有个函数
foo(string & str){}

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

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

foo( const string & str){}

就好了

taodm 2010-03-18
  • 打赏
  • 举报
回复
楼主用的什么编译器啊?
冻结 2010-03-18
  • 打赏
  • 举报
回复
foo("hi");//错误
把一个文字常量传给一个string &是不可以的。
liyanlin122 2010-03-18
  • 打赏
  • 举报
回复
foo("hi");//错误
试图将const string 或者const char * 转化为 string & ,这是不允许的!
kuillldan 2010-03-18
  • 打赏
  • 举报
回复
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()函数
//将引用创建的临时变量.
}
加载更多回复(13)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧