shared_ptr<void>管理一个void*。右值就是指(Guard(p))这个表达式只能放在等号右边,如果它单独作为一个语句,他左边就会自动产生一个等号和一个匿名的auto变量,auto推导成shared_ptr<void>类型。程序运行到分号的位置这个匿名变量就自动销毁了,顺带就把p给Release()了,导致指针或句柄悬挂
现在版本的C++建议这么写,不建议用宏
```
template<typename _Create, typename _Release>
struct Guard final{
constexpr Guard(_Create _create, _Release _release): create(_create), release(_release){}
std::shared_ptr<void> operator()() const{return {create(), release};}
private:
_Create create;
_Release release;
};
//这是构造函数模板参数推导辅助语句,以后版本的C++会默认替你把这句写了
template<typename _Create, typename _Release>
Guard(_Create, _Release) -> Guard<_Create, _Release>;
```
这个写法往往用来避免crt对象生命周期跨链接库造成资源分配/释放调用不匹配,GetHandle()返回的实际往往就是通过依赖注入得到的接口对象。假设下面的代码是被导入的,GetHandle()返回的接口对象指针就是由宿主维护的,这是对工厂设计模式的一种raii逆适配
```
```
```cpp
template< class Y >
explicit shared_ptr( Y* ptr );
//声明,现查的
```
右值,就是`临时值`的意思.这句返回`shared_ptr`,没有赋值,就是个`临时值`.
感觉,像这种出域后`执行动作`,搞成个`结构`比较好,不必用宏.