繁体   English   中英

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

[英]How do I understand how std::make_shared works?

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

        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), {});

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

详细output:

/usr/include/c++/11.1.0/bits/shared_ptr.h|873 col 5| 注意:候选模板被忽略:替换失败 [with _Tp = std::vector<char, std::allocator>]:推导出模板的不完整包 <std::istreambuf_iterator<char, 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>;或类似的东西)。

如何理解`std::make_shared<object> (“foo”)`?<div id="text_translate"><p> std::make_shared&lt;Object&gt;("foo")做什么?</p><pre> std::shared_ptr&lt;Object&gt; p1 = std::make_shared&lt;Object&gt;("foo");</pre><p> 我知道std::make_shared&lt;T&gt;是模板 class 并且我可以理解Object("foo")确实是临时的 object 。 但我无法理解std::make_shared&lt;Object&gt;("foo") 。</p><p> 有人可以逐步解释我创建的对象序列和它完成的操作吗?</p></div></object>

[英]How to understand `std::make_shared<Object>(“foo”)`?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM