免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: donet8
打印 上一主题 下一主题

[已解决]重载解析,为什么优先匹配非const版本? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-06-04 17:19 |只看该作者
本帖最后由 wwwsq 于 2012-06-04 17:20 编辑
Moon_Bird 发表于 2012-06-04 16:59
回复 3# wwwsq
有时候使用const修饰成员函数是必须得吧,
如果函数的参数为const reference传参的话,



Func(const A& a)就不是一种好的写法。这是典型的为了解决一个问题,不得不增加N个限制,然后引入2*N个问题

等const遇到template那才叫热闹。当我看到那些稀奇古怪的规定的时候,当时就震惊了。

作为对照,可以看看java、c#、php、python的语法。

论坛徽章:
0
12 [报告]
发表于 2012-06-04 17:46 |只看该作者
bruceteen 发表于 2012-06-04 16:57
回复 8# donet8

你的代码我看不懂呀, c_str()是个const成员,即const对象是可以调用它的


嗯,你说的对,能调用函数的不一定是左值,左值是有名称的,可以取地址。(s1+s2)="123";就编译不过。

论坛徽章:
0
13 [报告]
发表于 2012-06-04 17:50 |只看该作者
Moon_Bird 发表于 2012-06-04 16:59
回复 3# wwwsq
有时候使用const修饰成员函数是必须得吧,
如果函数的参数为const reference传参的话,


哦,可是我觉得你的说法似乎的出的结论是应该优先匹配const版本啊。

如果优先匹配const版本的函数,那么就相当于限定了函数体里面只能调用const版本的函数,这是个更加严格的限定。
然后再匹配非const版本,限定更加宽松。

论坛徽章:
0
14 [报告]
发表于 2012-06-04 17:56 |只看该作者
wwwsq 发表于 2012-06-04 17:19
Func(const A& a)就不是一种好的写法。这是典型的为了解决一个问题,不得不增加N个限制,然后引入2*N ...


不好体现在哪里?可否具体地说说

论坛徽章:
0
15 [报告]
发表于 2012-06-04 18:10 |只看该作者
本帖最后由 wwwsq 于 2012-06-04 18:11 编辑
shanehan 发表于 2012-06-04 17:56
不好体现在哪里?可否具体地说说



呃。。。这个帖子顶楼的问题就算一个。。。。要是不用const,不就没这个问题么?

另外,const遇到template也会出各种奇怪的问题。


论坛徽章:
0
16 [报告]
发表于 2012-06-04 22:30 |只看该作者
本帖最后由 xue-feng 于 2012-06-04 22:37 编辑
  1. struct FOO{

  2.         int a;
  3.         void test() { a = 3; cout << "no const" << endl;  
  4. };

  5. int main()
  6. {
  7.         FOO().test();
  8.            return 0;
  9. }
复制代码
临时对象 ,不是常量。应该优先是用 non const 。 楼主的问题是 cast 操作符函数,相当于调用成员函数。不是引用临时量。引用临时量是不允许的。


论坛徽章:
0
17 [报告]
发表于 2012-06-05 09:20 |只看该作者
xue-feng 发表于 2012-06-04 22:30
临时对象 ,不是常量。应该优先是用 non const 。 楼主的问题是 cast 操作符函数,相当于调用成员函数。不是 ...


可是我把test函数声明改成了用const&,传入一个非临时的变量,也还是不行啊:

  1. struct s;
  2. struct s1{
  3.     const s* m_s;
  4. };
  5. struct s2 : s1{};
  6. struct s{
  7.     operator s1()const{
  8.         cout << "operator s1() const" << endl;
  9.         return s1();
  10.     }
  11.     operator s2(){
  12.         cout << "operator s2()" << endl;
  13.         return s2();
  14.     }
  15. };
  16. void test(const s1& obj){}
  17. int main(void){
  18.     s obj;
  19.     test(obj);
  20.     return 0;
  21. }
复制代码
输出operator s2()

论坛徽章:
0
18 [报告]
发表于 2012-06-05 09:38 |只看该作者
是的,优先匹配非const函数。可以换种表达:非const对象调用非const函数,而const对象调用const函数。
函数名是相同的,假设优先匹配const函数,const对象和非const对象都调用const函数,那么非const函数永远不会被调用。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
19 [报告]
发表于 2012-06-05 09:57 |只看该作者
wwwsq 发表于 2012-06-04 17:19
Func(const A& a)就不是一种好的写法。这是典型的为了解决一个问题,不得不增加N个限制,然后引入2*N ...


如果什么限制都没有,那么写的人是爽了,但是读的人就郁闷了,着眼点太多……

论坛徽章:
0
20 [报告]
发表于 2012-06-05 15:36 |只看该作者
支持一下活动!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP