sgi stl中的源码里 __x=__x到底是何用,求大神解释

金丝龙麟闪电劈 2014-02-28 05:53:46



#define STL_REQUIRES( type_var, concept) \

do { \

void (* x)( type_var ) = concept##_concept_specification<

type_var >\

:: concept##_requirement_violation; __x = __x; } while (0)


于是就搜到了这个博客: http://saturnman.blog.163.com/blog/static/557611201111543620928/
__x = __x如何理解,这个一开始我也没有搞清楚,后来在网上找到了答案,这个是强行触发对类静态模版函数的实例化,如果不写上这名,类模版不会被实例化,其中的代码也不会被语法检查。我们所有的工作就都白费了。这也是推迟实例化的结果与避免它的方法/
可是还不理解? 为什么__x=__x 这个指针赋值一下,就能触发对类静态模版函数的实例化??
...全文
263 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vipcxj 2014-03-27
  • 打赏
  • 举报
回复
引用 10 楼 wangdahu888 的回复:
[quote=引用 7 楼 vipcxj 的回复:] 因为前一句只是对__x的声明和初始化,并不会引起模版实例化,因为编译器认为__x可能根本就不会被用到。第二句看似和第一句都是赋值,但第二句才是真正的赋值,并且用到了__x,这样编译器就认为必须要实例化静态函数模版了。当然第二句本身并没有实际意义,也不需要有实际意义,我们的目的只是要编译器不会忽略掉那个静态函数模版,并能对其进行编译器检查。
你说的有道理,可只是个指针赋值呀,就像前向引用一样,指针不需要具体的类型定义呀[/quote] 这只是用没用到的问题,编译器认为变量的声明和初始化并不代表这个变量确实被使用了,但赋值就绝对是被使用的,即时是自己赋值给自己。我认为需要特别提到的是这里起作用的可能是将这个变量赋给其他变量,而不是这个变量被别的变量赋值。当然也有可能两者都起作用了
  • 打赏
  • 举报
回复
引用 7 楼 vipcxj 的回复:
因为前一句只是对__x的声明和初始化,并不会引起模版实例化,因为编译器认为__x可能根本就不会被用到。第二句看似和第一句都是赋值,但第二句才是真正的赋值,并且用到了__x,这样编译器就认为必须要实例化静态函数模版了。当然第二句本身并没有实际意义,也不需要有实际意义,我们的目的只是要编译器不会忽略掉那个静态函数模版,并能对其进行编译器检查。
你说的有道理,可只是个指针赋值呀,就像前向引用一样,指针不需要具体的类型定义呀
derekrose 2014-03-04
  • 打赏
  • 举报
回复
#7 说的应该是对的
SweetTimeRose 2014-03-04
  • 打赏
  • 举报
回复
不懂。
vipcxj 2014-03-04
  • 打赏
  • 举报
回复
因为前一句只是对__x的声明和初始化,并不会引起模版实例化,因为编译器认为__x可能根本就不会被用到。第二句看似和第一句都是赋值,但第二句才是真正的赋值,并且用到了__x,这样编译器就认为必须要实例化静态函数模版了。当然第二句本身并没有实际意义,也不需要有实际意义,我们的目的只是要编译器不会忽略掉那个静态函数模版,并能对其进行编译器检查。
  • 打赏
  • 举报
回复
如果只是声明了x,在加上认为后面的代码也只是获得静态函数的地址。 可能就认为整个表达式没意义,就忽略掉了。
图灵狗 2014-03-03
  • 打赏
  • 举报
回复
只能帮你顶一下了!
引用 1 楼 wangdahu888 的回复:
大神们,给点面子,回个吧
  • 打赏
  • 举报
回复
大神们,给点面子,回个吧
luoweifu 2014-03-03
  • 打赏
  • 举报
回复
没用过这东西!
碼上道 2014-03-03
  • 打赏
  • 举报
回复
这个没有必要纠结吧,只是在编译期对函数指针做一下静态检查吧。 http://hi.baidu.com/walkandsing/item/21c445bcf4bd81f063388e41
Morrisss_ 2014-03-03
  • 打赏
  • 举报
回复
建议看看侯捷的STL源码剖析,要是这个很重要,需要我们了解书里应该会说是干嘛的。

64,331

社区成员

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

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