免费注册 查看新帖 |

Chinaunix

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

[C++] 《Effective C++》中的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-05 14:57 |只看该作者 |倒序浏览
在条款25中,作者欲通过member function templates(简称member templates)来提供泛型隐式转换,以达到以下效果:
  void f(int x);
  void f(string *ps);
  f(NULL); // 实际调用f(string *ps)
具体实现如下:
  const class {
  public:
      template<class T>    // 可以转换任何类型
      operator T*() const  // 的null非成员指针
      { return 0; }

      template<class C, class T>    // 可以转换任何类型
      operator T C::*() const       // 的null成员指针
      { return 0; }

  private:
      void operator&() const;    // 不能取其地址
  } NULL;

请问:转换函数(operator T*() 和 operator T c::*() )为什么不是 return static_cast<T*>(0) 而是 return 0?
谢谢。

[ 本帖最后由 thinshootout 于 2006-10-5 15:04 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-05 19:10 |只看该作者
c++中,0可以直接被赋值给任何类型的指针而不用类型转换。

论坛徽章:
0
3 [报告]
发表于 2006-10-05 21:29 |只看该作者
我记得在VC里

ifdef C_PLUS_PLUs
NULL = 0
else
NULL = (void *)0
endif

论坛徽章:
0
4 [报告]
发表于 2006-10-05 21:57 |只看该作者
to 2楼:
  我一直也是这么认为,可是在《Effective C++》的条款25中,作者给出例子:
  void f(int x);
  void f(string *ps);

  f(0);  // 调用f(int)还是f(string*)?
  答案是,0是一个int——准确地说,一个字面上的整数常量——所以,“总是”f(int)被调用。
如果如2楼所说,f(0)在编译时岂不是发生二义性错误?
请解答,谢谢。

论坛徽章:
0
5 [报告]
发表于 2006-10-06 02:04 |只看该作者
to 4楼:
0到指针不需要显示类型转换。就好像char到int不需要显示类型转化一样。

论坛徽章:
0
6 [报告]
发表于 2006-10-06 04:13 |只看该作者
原帖由 thinshootout 于 2006-10-5 21:57 发表
to 2楼:
  我一直也是这么认为,可是在《Effective C++》的条款25中,作者给出例子:
  void f(int x);
  void f(string *ps);

  f(0);  // 调用f(int)还是f(string*)?
  答案是,0是一个int——准确地说 ...

0可以无需任何显式转换而直接“赋值”给任何类型的指针变量。只需要记住这一点就可以了。也就是说,C++里,对0做了特殊对待。

论坛徽章:
0
7 [报告]
发表于 2006-10-06 09:17 |只看该作者
那5楼和6楼的意思是说,《Effective C++》的作者写错了?不然面对
  void f(int x);
  void f(string *ps);
来说,
  f(0)应该在编译时刻出错才对,因为编译器不知道应该把0转换为int还是string*,编译器拒绝作出判断,对吗?
但是(!!!)
通过实验发现,f(0)确实链接的是void f(int x),请给出解释。

谢谢。

论坛徽章:
0
8 [报告]
发表于 2006-10-06 10:20 |只看该作者
gcc 有一个有用的扩展: 用 typeof 操作符探测 0 的类型。


  1. int main()
  2. {
  3.       typeof(0) i = 0;
  4.       
  5.       *i = 1;         // 错误,说明 0 不是 pointer
  6.       i = 1;           // 正确, 0 是 int 型

  7.    
  8.     typeof((int *)0) p = 0;

  9.       p = &i;
  10.       *p = 10;  //  正确,说明必须经过显式cast 之后,也就是 (int *)0 才属于 pointer
  11.      
  12.        return 0;
  13. }
复制代码

[ 本帖最后由 mik 于 2006-10-6 10:22 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-10-06 15:49 |只看该作者
我想明白了,一定是
      template<class T>    // 可以转换任何类型
      operator T*() const  // 的null非成员指针
      { return 0; }
返回时已经将0隐式转换为T*了
此帖结帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP