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

标签 c++ shared

我遇到了一个优雅的行,将二进制文件读入像这样的 vector (有效):

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

因为我希望我的 vector 是一个共享指针,所以我写:

std::ifstream ifs("myfile.bin", std::ios::binary);
auto sp = std::make_shared<std::vector<char>>(std::istreambuf_iterator<char>(ifs), {});
即只需将 vector 构造函数参数传递给 make_shared (就像我通常创建任何对象的任何共享指针一样)。 但我得到:错误:没有调用“make_shared”的匹配函数?

详细输出:

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

关于c++ - 我如何理解 std::make_shared 的工作原理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67721174/

相关文章:

c++ - SetSuspendState 的问题

c++ - 使用 unique_ptr 控制文件描述符

eclipse - 多个用户在共享网络驱动器上使用 Git 存储库是否安全?

linux - 我需要使用 Linux 几天。网上有免费服务吗?

java - liblpsolve55.so : cannot open shared object file: No such file or directory

angular - 在具有多个模块(如 JHipster)的项目中嵌套 Angular 组件

c++ - 请求从 'int' 到非标量类型 'Point"的转换

c++ - 简单指针对象错误C++

c++ - 来自 Valgrind 的令人困惑的输出显示间接丢失的内存泄漏,但没有绝对丢失或可能丢失

facebook - 共享按钮不显示来自共享链接的图像