C++ 临时对象为const的一点测试

nullah 2010-10-27 02:13:43
环境: vs2008

std::string getString()
{
return “xxxx”;
}

std::string& str = getString(); // ---------------> 此处的临时对象不应该是const std::String& 吗?
str = "YYYY";
std::cout << str << std::endl;

编译通过 输出: YYYY



...全文
412 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 nullah 的回复:]

对于此贴 让我失望的是 前辈:akirya先生 和2楼的高分专家
我看我还是以后去刘未鹏的C++小组去讨论问题吧
[/Quote]
错的代码讨论啥?
zengjunzheng 2010-10-27
  • 打赏
  • 举报
回复
std::string& str = getString(); 这一句如果改成
std::string str = getString();是绝对没问题的,因为是=赋值。但就楼主给出的代码来说,很危险,因为采用的是引用变量,也就是本来在return之后,“XXXX”就被销毁了,但却被另一个变量引用了,这个引用变量是知道“XXXX”的存放位置的,故能对其重新赋值。也就是说假如被销毁对象的空间被其他程序或系统应用了,这时对其进行修改很可能就会引起系统崩溃。
emptyness 2010-10-27
  • 打赏
  • 举报
回复
话说 csdn现在水贴多的很, scanf参数少个&都能拿来问.
在这等情况下 看贴随意本来就是人之常情,基本现状.
要求别人一字不漏的对待你的问题,请问你是谁?你给多少钱? 在国内那么多博士跳楼的大背景下,别跟我提搞研究的精神 ,更何况C++标准也不属于具有较大意义的理论研究.
你丢一段代码在这里,除了标题, 也没有半点辅助大家进入你思考内容的文字.别人看错代码,你就这么失望? 撒泼的要换地方了.要换当然也是你的自由,本来csdn也的确太"水"了.但是你作为楼主也不是没有错的啊.另外你的分也太少了,20分, 话说scanf参数少个& 这样的问题 经常能把新手逼的动用50分的. 20分的问题难显研究意义,你加点文字描述也成啊.
星星都是回答别人问题而得到的,他们是不是面面高手,资深专家,星星证明不了,但星星能证明他们帮助过很多人.
tqtaigu520smiles 2010-10-27
  • 打赏
  • 举报
回复
进来学习!!!
Aniao 2010-10-27
  • 打赏
  • 举报
回复
看来是VS2008对右值引用已经有了初步实现。


VC2010据说是完全证实实现了这个C++0x标准


GCC楼主测试过没
Ethan_Hu 2010-10-27
  • 打赏
  • 举报
回复
好吧,偶被忽视了。。。 华丽丽的路过,睡意已解,继续发奋ing。。。
gules 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 nullah 的回复:]
引用 26 楼 gules 的回复:
引用 20 楼 nullah 的回复:
我想的话 C++标准就是这样定义的 请参照GCC的编译提示 也是这么个意思


C++标准里面从来没说过“临时对象就是const的”,而是说“临时对象本身不具有const属性,但它仍然不能被绑定于非const引用”!

我是从GCC的编译提示 自己这么认为
[/Quote]

你查找 iso iec 14882 吧,2003第二版,注意,这个不含C++0x的内容哦。
nullah 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gules 的回复:]
引用 20 楼 nullah 的回复:
我想的话 C++标准就是这样定义的 请参照GCC的编译提示 也是这么个意思


C++标准里面从来没说过“临时对象就是const的”,而是说“临时对象本身不具有const属性,但它仍然不能被绑定于非const引用”!
[/Quote]
我是从GCC的编译提示 自己这么认为
nullah 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 gules 的回复:]
引用 20 楼 nullah 的回复:
我想的话 C++标准就是这样定义的 请参照GCC的编译提示 也是这么个意思


C++标准里面从来没说过“临时对象就是const的”,而是说“临时对象本身不具有const属性,但它仍然不能被绑定于非const引用”!
[/Quote]
To gules:
有没有C++标准的描述链接呢 今天在C++标准委员会上找了很久没找到 谢了
Ethan_Hu 2010-10-27
  • 打赏
  • 举报
回复
顺便说一下,楼主发言很,嗯,“寂寞”。
分多有星星不代表很强,两月来到也看过了不少帖子,像Taodm, baihacker, akirya确实名副其实,不过有一些星星,倒确实只会忽悠。
gules 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 nullah 的回复:]
我想的话 C++标准就是这样定义的 请参照GCC的编译提示 也是这么个意思
[/Quote]

C++标准里面从来没说过“临时对象就是const的”,而是说“临时对象本身不具有const属性,但它仍然不能被绑定于非const引用”!
Ethan_Hu 2010-10-27
  • 打赏
  • 举报
回复
右值可不一定得是const !

string("xy")是临时对象吧, string("xy")[0] = 'y'; 这也是可以的,因为没有const
nullah 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hai040 的回复:]
引用 17 楼 nullah 的回复:
对于此贴 让我失望的是 前辈:akirya先生 和2楼的高分专家
我看我还是以后去刘未鹏的C++小组去讨论问题吧

不是什么时候都有空的...
[/Quote]
显然他们的回答没有经过任何论证
呵呵 一笑而过 结贴~~
jianshi051 2010-10-27
  • 打赏
  • 举报
回复
std::String& 是不是取地址呀?

那么是不是str的地址到了“xxx”,而内容是“yyyy”呢?
hai040 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 nullah 的回复:]
对于此贴 让我失望的是 前辈:akirya先生 和2楼的高分专家
我看我还是以后去刘未鹏的C++小组去讨论问题吧
[/Quote]
不是什么时候都有空的...
nullah 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 gules 的回复:]
引用 14 楼 nullah 的回复:
引用 4 楼 ethan_hu 的回复:
这个问题是很明显的,LZ既然也提出了疑问,那么就是怀疑compiler有误,事实就是这样。
换最新的cl或者用g++试试。

的确 在最新版本GCC下编译的结果:
提示: 不能对临时对象 创造非const引用

结论: vs2008 不是完全遵照C++标准?
请注意 我打的是个问号 而非真正的结论
……
[/Quote]
呵呵~~
nullah 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gules 的回复:]
引用 8 楼 ethan_hu 的回复:
To glues:

没说临时对象是const,你认为非常量引用能引用右值?


我有说过“非常量引用能引用右值”吗?我说的是“临时对象本身就是const的吗?”。
[/Quote]
我想的话 C++标准就是这样定义的 请参照GCC的编译提示 也是这么个意思
hai040 2010-10-27
  • 打赏
  • 举报
回复
vs是有点怪,临时对象在最后才析构,参数也是
void f(string&);能用f(string("1"));调

struct test{int i;test(int ii):i(ii){}~test(){cout << '~' << i;}};
test tf() {return 1;}
int main()
{
test& t = tf();
t.i = 2;
cout << t.i;

return 0;
}
gules 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 nullah 的回复:]
引用 4 楼 ethan_hu 的回复:
这个问题是很明显的,LZ既然也提出了疑问,那么就是怀疑compiler有误,事实就是这样。
换最新的cl或者用g++试试。

的确 在最新版本GCC下编译的结果:
提示: 不能对临时对象 创造非const引用

结论: vs2008 不是完全遵照C++标准?
请注意 我打的是个问号 而非真正的结论
[/Quote]

“此处的临时对象不应该是const std::String& 吗?”
楼主,此句我理解为反问句,意思就是“此处的临时对象应该是const std::string&”;
因此,我回答“谁说临时对象就是const的?”。
是我理解错误吗?
加载更多回复(17)

65,187

社区成员

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

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