免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2087 | 回复: 8
打印 上一主题 下一主题

函数子,问大家一个问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-19 11:49 |只看该作者 |倒序浏览
本帖最后由 ccnuliu 于 2011-05-19 12:38 编辑
  1. #include<iostream>
  2. using namespace std;
  3. #include<string>
  4. #include<vector>
  5. struct test
  6. {
  7.         void operator()(int a)
  8.         {
  9.                 cout<<a;
  10.         }
  11. };
  12. void fun(test &a)
  13. {
  14.         a(12);
  15. }


  16. struct print
  17. {
  18.         void operator()(int a)
  19.         {
  20.                 cout<<a;
  21.         }
  22. };
  23. int main()
  24. {
  25.         fun(test());
  26.         vector<int> obj;
  27.         obj.push_back(123);
  28.         obj.push_back(456);
  29.         for_each(obj.begin(),obj.end(),print());
  30.         return 0;
  31. }
复制代码
这里的 void operator()(int a) const 和void fun(const test &a)
为啥一定要加const,不然编译不过。
foreach.cpp: In function `int main()':
foreach.cpp:27: error: invalid initialization of non-const reference of type 'test&' from a temporary of type 'test'
foreach.cpp:13: error: in passing argument 1 of `void fun(test&)'




而给for_each的void operator()(int a)却不需要加const?
  1. template<class _InIt,
  2.     class _Fn1> inline
  3.     _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func)
  4.     {    // perform function for each element

  5.     _DEBUG_RANGE(_First, _Last);
  6.     _DEBUG_POINTER(_Func);
  7.     _CHECKED_BASE_TYPE(_InIt) _ChkFirst(_CHECKED_BASE(_First));
  8.     _CHECKED_BASE_TYPE(_InIt) _ChkLast(_CHECKED_BASE(_Last));
  9.     for (; _ChkFirst != _ChkLast; ++_ChkFirst)
  10.         _Func(*_ChkFirst);
  11.     return (_Func);
  12.     }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-05-19 12:33 |只看该作者
void fun(const test &a)
你用const引用调用调用操作符,当然this必须是const的

论坛徽章:
0
3 [报告]
发表于 2011-05-19 12:39 |只看该作者
void fun(const test &a)
你用const引用调用调用操作符,当然this必须是const的
liwangli1983 发表于 2011-05-19 12:33



这里换成 void fun(const test &a)才不会报错的。

论坛徽章:
0
4 [报告]
发表于 2011-05-19 12:46 |只看该作者
这里换成 void fun(const test &a)才不会报错的。
ccnuliu 发表于 2011-05-19 12:39



    显然,因为:
        fun(test());
这句,是用一个临时的test对象做为实参。非const引用无法绑定临时对象,只有const引用才可以。
你这样:
test ff;
fun(ff);
这样fun的形参就不必为const了。

论坛徽章:
0
5 [报告]
发表于 2011-05-19 13:30 |只看该作者
显然,因为:
        fun(test());
这句,是用一个临时的test对象做为实参。非const引用无法绑 ...
liwangli1983 发表于 2011-05-19 12:46



   
你看我贴了stl的源码了。他也是临时变量,但是他不是const

论坛徽章:
0
6 [报告]
发表于 2011-05-19 13:45 |只看该作者
你看我贴了stl的源码了。他也是临时变量,但是他不是const
ccnuliu 发表于 2011-05-19 13:30



    从你给的源码来看,人家传的不是引用吧。。。

论坛徽章:
0
7 [报告]
发表于 2011-05-19 14:01 |只看该作者
回复 6# liwangli1983


    恩,好奇怪,他这里为啥传值?


恩,临时对象,必须传给const引用。这是为啥呢???

论坛徽章:
0
8 [报告]
发表于 2011-05-19 14:05 |只看该作者
回复  liwangli1983


    恩,好奇怪,他这里为啥传值?


恩,临时对象,必须传给const引用。这是 ...
ccnuliu 发表于 2011-05-19 14:01

传非const引用,一般意味着你要修改这个对象。对于临时对象,你的修改不会什么作用(临时对象无名,你无法再次引用,而且不知道什么时候就被析构了),这样做没有任何意义。所以不允许传临时对象的引用。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2011-05-19 17:45 |只看该作者
看參數。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP