关于非const引用作参数的函数能否接受临时对象的问题

clocking 2005-03-19 07:36:14
近段时间在学习C++编程思想,在学到常量这一章时有个问题始终无法理解.书上说:临时变量有这么一种情况:它们自动成为常量.然后有一个示例:
//: C08:ConstTemporary.cpp
// Temporaries are const

class X {};

X f() { return X(); } // Return by value

void g1(X&) {} // Pass by non-const reference
void g2(const X&) {} // Pass by const reference

int main() {
// Error: const temporary created by f():
//! g1(f());////这一句?????????
// OK: g2 takes a const reference:
g2(f());
return 0;
} ///:~
问题在于g1(f())并不是像书上说的会出错或者出警告.我用VC6.0,编译顺利通过,也没有警告.f()产生临时对象传递给g1(),但g1()并不是像书上说的那样参数必须是const引用.难道是VC6.0对C++标准在这一点上不支持?麻烦高手帮小弟指点指点!!!
...全文
235 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
clocking 2005-03-23
  • 打赏
  • 举报
回复
结贴了,顶者均有分,感谢各位的回复!!!
clocking 2005-03-23
  • 打赏
  • 举报
回复
正如FengQingYang2008所说提高警告等级,并作为错误出理,编译就不能通过!
allen_zhaozhencn 2005-03-20
  • 打赏
  • 举报
回复
不能将临时对象绑定到一个非const对象的引用。 只能将其绑定到const对象的引用上。注意,临时对象本身并不是const的
FengQingYang2008 2005-03-20
  • 打赏
  • 举报
回复
你把警告等级设置为4就会出现警告,你把警告视为错误就编译不通过了。
oyljerry 2005-03-20
  • 打赏
  • 举报
回复
嗯,提高一下警告等级看看,
VC对标准的支持是有些可能不是非常的完善
dongpy 2005-03-19
  • 打赏
  • 举报
回复
VC6真的很奇怪,这种情况下又是和标准一致的。

class A
{
protected:
int a;
public:
A(int i):a(i){};
};

void fun(const A& a)
{
}

int main(int argc, char *argv[])
{
fun(2); //生成临时对象
return 0;
}
//这样是通过的。
把fun改成 void fun(A& a)就通不过。
这说明VC6部分支持了这个标准。
JustLikeTheWind 2005-03-19
  • 打赏
  • 举报
回复
这个问题我在gcc中碰到过,gcc不允许g1(f());这样的语句出现。
我在TCPL中也读过这个问题的解释,看来是VC6又一个对标准支持不好的证据吧。
llmsn 2005-03-19
  • 打赏
  • 举报
回复
其它教材好像没提过说临时变量自动成为常量.
dongpy 2005-03-19
  • 打赏
  • 举报
回复
你换个编译器试试。

非const引用类型参数好像是不能绑定临时对象的。
kobefly 2005-03-19
  • 打赏
  • 举报
回复
函数声明里常量做参数

是说这个参数不可被改变

但也可以传非常量给这个函数,但这个本身为非常量的参数
在这个函数里同样是不会被修改的
languagec 2005-03-19
  • 打赏
  • 举报
回复

64,654

社区成员

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

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