网站首页 文章专栏 深入应用C++11的疑惑
深入应用C++11的疑惑
编辑时间:2021-06-29 01:22:35 作者:法外张三 3条评论


    出自:purecpp.cn

    地址: www.purecpp.cn

    转载请注明出处!


来说两句吧
登录才能发表评论。
最新评论
  • qicosmos
    fqbqrr 2021-06-29 02:07:41

    ```cpp

    template< class Y >

    explicit shared_ptr( Y* ptr );

    //声明,现查的

    ```

    右值,就是`临时值`的意思.这句返回`shared_ptr`,没有赋值,就是个`临时值`.

    感觉,像这种出域后`执行动作`,搞成个`结构`比较好,不必用宏.


  • qicosmos
    loop 2021-06-29 12:15:32

    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逆适配

    ```

    constexpr auto make_handle = Guard{[]{return GetHandle()->Create();}, [](auto _p){GetHandle()->Release(_p);}};
    std::shared_ptr<voidbuffer_ptr = make_handle();

    ```

  • qicosmos
    qicosmos 2021-06-29 17:57:36

    这里void*是为了做一个泛化。

    https://github.com/qicosmos/cosmos/blob/master/ScopeGuard.hpp

    可以用这个scope_gard

Absolutely

purecpp

一个很酷的modern c++开源社区


[社区开源项目列表,点击前往]


purecpp社区自2015年创办以来,以“Newer is Better”为理念,相信新技术可以改变世界,一直致力于现代C++研究、应用和技术创新,期望通过现代C++的技术创新来提高企业生产力和效率。


社区坚持只发表原创技术文章,已经累计发表了一千多篇原创C++技术文章;


组织了十几场的C++沙龙和C++大会,有力地促进了国内外C++开发者之间的技术交流;


开源了十几个现代C++项目,被近百家公司所使用,有力地推动了现代C++在企业中的应用。


期待更多的C++爱好者能参与到社区C++社区的建设中来,一起为现代C++开源项目添砖加瓦,一起完善C++基础设施和生态圈。


微信公众号:purecpp, 社区邮箱: purecpp@163.com


友情链接