c++ - 如何为采用一个参数的类初始化 shared_ptr vector ?

标签 c++ c++11

以下是扩展版,效果很好,只是我想使用初始化列表

vector<shared_ptr<Foo>> inputs = {
    make_shared<Foo>("foo"),
    make_shared<Foo>("bar"),
    make_shared<Foo>("baz")
};

所以我试过类似的东西

vector<shared_ptr<Foo>> inputs2 = {
    { "foo" },
    { "bar" },
    { "baz" }
};

还有两个括号,或者没有,即 {{ "foo"}} 和只是 "foo"

std::shared_ptr<Foo> foo = { "foo" };

也不编译,所以我认为这根本不是 vector 的问题,而是用初始化列表初始化 shared_ptrs。

最佳答案

唯一合理的版本是您建议的第一个版本。
如果您查看 std::shared_ptr documentation ,您将看到没有构造函数将托管对象构造函数参数作为可变参数模板。这意味着您不会找到类似以下内容的内容:

template<class T,class... Arg>
std::shared_ptr<T>::shared_ptr(Args&&... args)

所以你真的不能做类似的事情

std::shared_ptr<std::string> p("hi there");

这是行不通的。 您可以为 std::shared_ptr 做什么用 T* 构造它,所以这应该有效:

std::shared_ptr<std::string> p(new std::string("hi"));

现在,您可能会想,“嘿!我可以在初始化列表中使用它!”但不,这个:

std::initializer_list<std::shared_ptr<std::string>> il{
        new std::string("hi there"),
        new std::string("hi there")
};

将不起作用,因为该特定构造函数具有 explicit关键字,因此必须明确声明!

所以最终,你可以写出类似

的东西
std::initializer_list<std::shared_ptr<std::string>> il{
     std::shared_ptr<std::string>(new std::string("hi there"))
};

但正如您自己所见,您的第一次尝试要简单得多,时间也短得多。

总结:鉴于没有shared_ptr的事实将参数传递给托管对象构造函数的构造函数,你不能真正使用 {args...}作为有效语法。鉴于 shared_ptr得到T*必须明确声明,你不能做类似 {new T(args..)} 的事情, 所以最简单的方法是使用 std::make_shared .

附言在您的第一个片段中,用于初始化 vector 的东西 初始化列表。除了它的类型是 std::initializer_list<std::shared_ptr<Foo>>而不是 std::initializer_list<Foo>就像第二个片段。

关于c++ - 如何为采用一个参数的类初始化 shared_ptr vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32940308/

相关文章:

c++ - 允许模拟类继承自最终类

c++ - 使用完后删除所有堆分配的内存是否可行?

C++ 头文件到源代码?

c++ - 来自 sfml 示例的重构 pong 中的棘手错误

c++ - 错误 : Use of class template requires template argument list

c++ - 如果跨线程共享变量,将变量标记为 volatile 有用吗?

c++ - 来自 std::wstring 的 Asisgn LPCWSTR 数组

c++ - NITE2::UserTracker 在读取 oni 文件时崩溃

c++ - 如果 const 引用也只需要一个拷贝,为什么在 C++11 中建议按值传递(如果需要拷贝)?

c++ - 这个部分模板特化有什么问题?