强制转换和引用参数的问题

koalapheonix 2011-08-10 09:32:53

#include <iostream>

using namespace std;

#define n32_t int

void print( n32_t &a )
{
cout << a << endl;
}

int main()
{
int a = 10;
print( (int)a );

return 0;
}

这段程序编译不过去了,我知道怎么把它改的能通过,我只是想问的是错误背后的原因是什么?
...全文
226 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
至善者善之敌 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 babilife 的回复:]
引用 4 楼 koalapheonix 的回复:
引用 2 楼 babilife 的回复:

楼主的代码你先说哪有问题!我怎么没看出来?

main.cpp:15: 错误:将类型为 ‘int&amp;’ 的非 const 引用初始化为类型为 ‘int’ 的临时变量无效
main.cpp:7: 错误:在传递实参 1 (属于 ‘void print(int&amp;)’)
……
[/Quote]
看了一下汇编


int a = 10;
0041158E mov dword ptr [a],0Ah
print( (int)a );
00411595 lea eax,[a]
00411598 push eax
00411599 call print (411262h)
0041159E add esp,4


看来是同类型转换,编译做了优化处理,并没有做转换过程~~
pengzhixi 2011-08-10
  • 打赏
  • 举报
回复
vs的编译器在这个问题上都没有遵循标准的。所以在vs系列的编译器上是没任何问题的。
至善者善之敌 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 koalapheonix 的回复:]
引用 2 楼 babilife 的回复:

楼主的代码你先说哪有问题!我怎么没看出来?

main.cpp:15: 错误:将类型为 ‘int&’ 的非 const 引用初始化为类型为 ‘int’ 的临时变量无效
main.cpp:7: 错误:在传递实参 1 (属于 ‘void print(int&)’)

是不是强制转换出的变量在作为参数时都是const变量?
[/Quote]

如果是强转的话会产生临时变量,也就是右值,右值不能赋值给& ,只能赋值给CONST &

看来事这个原因了,我用的VS2005没产生错误,看来标准支持的并不好~
pengzhixi 2011-08-10
  • 打赏
  • 举报
回复
额 标准规定了只有const &才可以引用临时对象。你的强制转换实际上是产生了临时对象的。
koalapheonix 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 babilife 的回复:]

楼主的代码你先说哪有问题!我怎么没看出来?
[/Quote]
main.cpp:15: 错误:将类型为 ‘int&’ 的非 const 引用初始化为类型为 ‘int’ 的临时变量无效
main.cpp:7: 错误:在传递实参 1 (属于 ‘void print(int&)’)

是不是强制转换出的变量在作为参数时都是const变量?
jlulshl 2011-08-10
  • 打赏
  • 举报
回复
print应该是系统保留的关键字吧。
至善者善之敌 2011-08-10
  • 打赏
  • 举报
回复
楼主的代码你先说哪有问题!我怎么没看出来?
pengzhixi 2011-08-10
  • 打赏
  • 举报
回复
void print( const n32_t &a )

65,179

社区成员

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

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