关于const引用的问题

dwen20 2008-05-19 09:52:46
编译运行环境:VC++ 2008 Express
问题来源:C++ Primer中文版P52 OR 英文版Chapter2 Section2.5

是这样的
代码:
double dval=3.14;
const int &ri=dval;

书上解释为:
等价于
int temp=dval;
const int &ri=temp;

这个不错,我验证过;但问题是:
如果我把const int &ri=dval;放在main函数以外会有如下运行错误:
CXX0030:Error:expression cannot be evaluated
而放在main()函数内部则运行不会出错。

注:不管外部内部,编译都通过,并且warning C4244: 'initializing' : conversion from 'float' to 'const int', possible loss of data

信息够详细了吧,求高手给讲解一下这是为什么?
...全文
127 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
dwen20 2008-05-19
  • 打赏
  • 举报
回复
但是考虑到大多数编译器(目前看来是所有)都不会报这种错,是不是一定就是编译器的问题呢?
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 arong1234 的回复:]
编译没错误只说明编译器检查不严格。程序员应该比编译器要求高,不要满足于编译没错。编译没错但是实际错误得代码比比皆是,编译没错是最低要求(只有你有非常明显且很silly得错误编译器才报错)

所以不要拿“编译没错”做挡箭牌

至于你得“而且”部分,当然,我就是建议你用
int temp= dval;
const int & ri=temp; 我们说类型必须一样,是指reference ri和他引用得对象temp完全一样。temp=dval之后,temp其实和已经…
[/Quote]

老实说,我就是觉得书上说的值得怀疑,才实验的,结果我现在已经不知道该不该认同书上的了。
arong1234 2008-05-19
  • 打赏
  • 举报
回复
编译没错误只说明编译器检查不严格。程序员应该比编译器要求高,不要满足于编译没错。编译没错但是实际错误得代码比比皆是,编译没错是最低要求(只有你有非常明显且很silly得错误编译器才报错)

所以不要拿“编译没错”做挡箭牌

至于你得“而且”部分,当然,我就是建议你用
int temp= dval;
const int & ri=temp; 我们说类型必须一样,是指reference ri和他引用得对象temp完全一样。temp=dval之后,temp其实和已经dval完全没有关系了(除了他们得值比较接近)
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 arong1234 的回复:]
报错才是合理的,不报错的才有问题。引用和被引用的对象应该是完全一致的,这里不应该有所谓的隐式类型转换。如果这都有类型转换,引用怎么能refer到通一个对象
引用 7 楼 dwen20 的回复:
我在VC6上也运行没有问题了,看来真的是编译器的问题,VC++ 2008啊!唉。
[/Quote]
可是我还是不能理解,为什么一个正确一个错误,要报错为什么不一块报呢,而且C++ Primer上的说法,
即等价为
int temp=dval;
const int &ri=temp;
这就不应该错了。
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 arong1234 的回复:]
不报错的那个编译器有问题,引用必须类型匹配,类型不匹配是有问题的

[/Quote]

可是编译没有错误啊,而且如果
int temp=dval;
const int &ri=temp;
这样的话就没有类型匹配的问题。
arong1234 2008-05-19
  • 打赏
  • 举报
回复
报错才是合理的,不报错的才有问题。引用和被引用的对象应该是完全一致的,这里不应该有所谓的隐式类型转换。如果这都有类型转换,引用怎么能refer到通一个对象
[Quote=引用 7 楼 dwen20 的回复:]
我在VC6上也运行没有问题了,看来真的是编译器的问题,VC++ 2008啊!唉。
[/Quote]
arong1234 2008-05-19
  • 打赏
  • 举报
回复
报错才是合理的,不报错的才有问题。引用和被引用的对象应该是完全一致的,这里不应该有所谓的隐式类型转换。如果这都有类型转换,引用怎么能refer到通一个对象
[Quote=引用 7 楼 dwen20 的回复:]
我在VC6上也运行没有问题了,看来真的是编译器的问题,VC++ 2008啊!唉。
[/Quote]
arong1234 2008-05-19
  • 打赏
  • 举报
回复
不报错的那个编译器有问题,引用必须类型匹配,类型不匹配是有问题的

[Quote=引用 6 楼 dwen20 的回复:]
以下代码运行正确

C/C++ code
#include <iostream>

float dval=8.55f;

int main()
{
const int &ri=dval;
std::cout<<ri;
return 0;
}




以下代码运行错误

C/C++ code
#include <iostream>

float dval=8.55f;
const int &ri=dval;

int main()
{
std::cout<<ri;
return 0;
}




难道真的是编译器的问题,昏死了。
[/Quote]
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 matrixdwy 的回复:]
我试过了,用DEV-CPP不管是里面还是外面,都WARNING。。。
[Warning] converting to `int' from `float'
[/Quote]
这个一直都是啊,问题是一个运行正确,一个运行报错。
matrixdwy 2008-05-19
  • 打赏
  • 举报
回复
我试过了,用DEV-CPP不管是里面还是外面,都WARNING。。。
[Warning] converting to `int' from `float'
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 matrixdwy 的回复:]
用DEV-CPP看看
[/Quote]
4楼说OK。
matrixdwy 2008-05-19
  • 打赏
  • 举报
回复
用DEV-CPP看看
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 matrixdwy 的回复:]
不安全类型转换
[/Quote]
这么说是VC++ 2008更强大一点?
dwen20 2008-05-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 baihacker 的回复:]
注:不管外部内部,编译都通过,并且warning C4244: 'initializing' : conversion from 'float' to 'const int', possible loss of data
类型不对一个是float一个是int
[/Quote]

我实际用的是float,不好意思了,呵呵,现在把代码贴出来了。
matrixdwy 2008-05-19
  • 打赏
  • 举报
回复
不安全类型转换
dwen20 2008-05-19
  • 打赏
  • 举报
回复
我在VC6上也运行没有问题了,看来真的是编译器的问题,VC++ 2008啊!唉。
dwen20 2008-05-19
  • 打赏
  • 举报
回复
以下代码运行正确

#include <iostream>

float dval=8.55f;

int main()
{
const int &ri=dval;
std::cout<<ri;
return 0;
}


以下代码运行错误

#include <iostream>

float dval=8.55f;
const int &ri=dval;

int main()
{
std::cout<<ri;
return 0;
}


难道真的是编译器的问题,昏死了。
guzhilei1986 2008-05-19
  • 打赏
  • 举报
回复
是不是楼主某些细节没有提到,或是编译器的差异。
guzhilei1986 2008-05-19
  • 打赏
  • 举报
回复
用devcpp也都过了。并且运行没有报错。
9527他大爷 2008-05-19
  • 打赏
  • 举报
回复
vc6.0下在main内外都运行通过

warning 是因为将double赋值给int而致(int temp=dval; dval是double类型)
加载更多回复(2)

64,685

社区成员

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

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