簡體   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