2 解读argument_wrapper
- rttr/detail/misc/argument_wrapper.h
argument_wrapper是将变量右值地址保存成void* m_data中,用于函数参数的传递,所以argument_wrapper是不控制变量的生存期,生存期由外部调用者控制。
1. argument_wrapper的构造
argument_wrapper() : m_data(nullptr) {}
template<typename T, typename Tp = typename std::enable_if<
!std::is_same<T, argument_wrapper>::value, T>::type>
argument_wrapper(T&& data) : m_data(const_cast<void*>(
reinterpret_cast<const void*>(std::addressof(data)))) {}
- argument_wrapper有2个构造函数,第一个构造函数用于传递空参数。
- 第二个构造函数就是将右值的指针保存起来,待invoke的时候在取出使用。它的第一个模板参数就是传进来的值的类型,第二个模板参的功能是防止传入的参数也是一个argument_wrapper类型,这个是不允许的。
- 给m_data的赋值的过程实际上就是把传入的变量的地址转成void*赋给m_data,因为传入的对象是一个右值,因此它可能是const的也可能不是const,而reinterpret_cast不能把const转成非const,但是非const是可以const,所以 reinterpret_cast 将指针统一转成 const void* 再通过const_cast 转成 void* 赋值给m_data。