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

jjjwad0x  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(253)

我遇到了一个优雅的行阅读一个二进制文件到一个向量,像这样(工作):

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第5栏|注意:候选模板被忽略:替换失败[使用_Tp =标准::向量〈字符,标准::分配器〉]:模板参数“_Args”的导出不完整包〈std::istreambuf_iterator〈char,std::char_traits〉,(无值)〉||创建共享(_参数&&... __参数)

lhcgjxsq

lhcgjxsq1#

这将工作:

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>;或类似的东西)。

相关问题