![](/img/trans.png)
[英]How to understand `std::make_shared<Object>(“foo”)`?
[英]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>;
或類似的東西)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.