微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何理解 std::make_shared 的工作原理?

如何解决我如何理解 std::make_shared 的工作原理?

我遇到了一条优雅的路线,将二进制文件读入这样的向量中(有效):

        std::ifstream ifs("myfile.bin",std::ios::binary);
        std::vector<char> buffer(std::istreambuf_iterator<char>(ifs),{});

相反,因为我希望我的向量是一个共享指针,所以我写了:

        std::ifstream ifs("myfile.bin",std::ios::binary);
        auto sp = std::make_shared<std::vector<char>>(std::istreambuf_iterator<char>(ifs),{});

即只是将向量构造函数参数传递给 make_shared (就像我通常创建任何对象的任何共享指针一样)。 但我得到:错误调用“make_shared”没有匹配的函数

详细输出

/usr/include/c++/11.1.0/bits/shared_ptr.h|873 col 5|注意:候选模板被忽略:替换失败 [with _Tp = std::vector]:推导出不完整包 <:istreambuf_iterator std::char_traits>,(no value)> 模板参数'_Args' || make_shared(_Args&&... __args)

解决方法

这会起作用:

std::ifstream ifs("myfile.bin",std::ios::binary);
auto sp = std::make_shared<std::vector<char>>(std::istreambuf_iterator<char>(ifs),std::istreambuf_iterator<char>{});

这是因为您正在使用这个可变参数模板:

template<class T,class... Args>
shared_ptr<T> make_shared( Args&&... args );

如果没有手动实例化,每个参数类型都必须是可推导的。 “{}”不允许参数推导,因此会出现编译器错误。令人难过的是,您还可以显式实例化模板:

auto sp = std::make_shared<std::vector<char>,std::istreambuf_iterator<char>,std::istreambuf_iterator<char>>({ifs},{});

在这两种情况下,迭代器的类型别名可能会提高可读性(using InputIt = std::istreambuf_iterator<char>; 或类似的东西)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。