代码改变世界

当std::ref遇到前置声明

2013-05-14 09:51  yu_yu  阅读(290)  评论(0编辑  收藏  举报

 

话说,起因是这样的:

有一个前置声明的类型

clip_image001

然后又一个回调函数使用了一个session_t的引用(注意,在下面这段代码能编译通过)

clip_image003

在这里,handler_(session,…)可以看成是一个std::function的对象,而handler的原型是

[](network::session_t &, …){};在这里handler_只需要把session以引用的方式转发出去就行了,可是在给session加上std::ref后却变异失败,如这样handler_(std::ref(session),…);编译器抱怨说,

clip_image005

说这个session_t不是完整类型,是的,session_t是一个前置声明,因为这里并没有用到该类型的成员,所以没必要。但是以值拷贝的方式却能编译通过。

再次看了一下std::ref的实现:如下

clip_image006

clip_image007

clip_image009

根据错误提示,就是std::is_abstract认为session_t不是一个完整类型。

我的疑问是,为啥按值拷贝可以呢?而又不会造成拷贝的效果?我很迷茫!