当std::ref遇到前置声明
话说,起因是这样的:
有一个前置声明的类型
然后又一个回调函数使用了一个session_t的引用(注意,在下面这段代码能编译通过)
在这里,handler_(session,…)可以看成是一个std::function的对象,而handler的原型是
[](network::session_t &, …){};在这里handler_只需要把session以引用的方式转发出去就行了,可是在给session加上std::ref后却变异失败,如这样handler_(std::ref(session),…);编译器抱怨说,
说这个session_t不是完整类型,是的,session_t是一个前置声明,因为这里并没有用到该类型的成员,所以没必要。但是以值拷贝的方式却能编译通过。
再次看了一下std::ref的实现:如下
根据错误提示,就是std::is_abstract认为session_t不是一个完整类型。
我的疑问是,为啥按值拷贝可以呢?而又不会造成拷贝的效果?我很迷茫!