- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
#include <iostream>
#include <memory>
class Base
{
public:
Base() {}
};
class Derived : public Base
{
public:
Derived() {}
Derived(std::initializer_list<std::pair<int, std::shared_ptr<Base>>>) {}
};
int main(int argc, char ** argv)
{
auto example = new Derived({
{ 0, std::make_shared<Derived>() }
});
return 0;
}
它正常工作( live preview ),但是当我尝试使用 std::make_shared
和 std::initializer_list
作为参数时,我得到了错误:
auto example = new Derived({
{ 0, std::make_shared<Derived>({
{ 0, std::make_shared<Derived>() }
}) }
});
正如您在 live preview 上看到的那样.
error: too many arguments to function...
只有当我这样做时它才有效(live preview):
auto example = new Derived({
{ 0, std::make_shared<Derived>(std::initializer_list<std::pair<int, std::shared_ptr<Base>>> {
{ 0, std::make_shared<Derived>() }
}) }
});
我想知道的是:为什么只有当我将 std::initializer_list
作为参数传递给 std::make_shared
而不是使用 { {}}
就像这样:
auto example = new Derived({ { 0, std::make_shared<Base>() } });
是否可以让 std::make_shared
接受它?
提前致谢。
最佳答案
原因
auto example = new Derived({
{ 0, std::make_shared<Derived>() }
});
有效的是编译器知道它必须匹配初始化器
{{ 0, std::make_shared<Derived>() }}
不知何故与构造函数
Derived::Derived(std::initializer_list<std::pair<int, std::shared_ptr<Base>>>) {}
所以很明显初始化列表的元素,
{ 0, std::make_shared<Derived>() }
需要用于初始化std::pair<int, std::shared_ptr<Base>>
.然后它找到一个包含两个元素的对的构造函数,
pair::pair (const first_type& a, const second_type& b);
在哪里 first_type
是 int
和 second_type
是 std::shared_ptr<Base>
.所以最后我们看到参数 std::make_shared<Derived>()
隐式转换为 std::shared_ptr<Base>
,我们可以开始了!
在上面,我指出编译器通过寻找一个构造函数来处理初始化列表,该构造函数直接接受初始化列表或适当数量的参数,然后在适当的隐式转换后将初始化列表的元素传递给该构造函数如有必要。例如,编译器可以确定您的 std::shared_ptr<Derived>
需要隐式转换为 std::shared_ptr<Base>
在上面的例子中只是因为对的构造函数需要它。
现在考虑
std::make_shared<Derived>({
{ 0, std::make_shared<Derived>() }
})
问题是make_shared<Derived>
是一个部分专用的函数模板,可以接受任意数量和类型的参数。因此,编译器不知道如何处理初始化列表
{{ 0, std::make_shared<Derived>() }}
重载解析时不知道需要转换成std::initializer_list<std::pair<int, std::shared_ptr<Base>>>
.此外,braced-init-list 永远不会被推导出为 std::initializer_list<T>
通过模板扣除,所以即使你有类似的东西
std::make_shared<Derived>({0, 0})
和Derived
有一个合适的构造函数采用 std::initializer_list<int>
,它仍然无法工作,原因相同:std::make_shared<Derived>
将无法为其参数推断出任何类型。
如何解决这个问题?不幸的是,我看不到任何简单的方法。但至少现在你应该知道为什么你写的东西不起作用了。
关于c++ - std::make_shared 与 std::initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24234480/
我在 boost::asio 中做了一个 echo-server 示例。但是使用 boost::make_shard 会导致“未知异常”,而 std::make_shared 则不会。请参阅注释行。
我一直在做一些现场性能测试 1>std::shared_ptr, std::make_shared based on 'gcc 4.7.2' & 'VC10 implementation' 2>boo
问题 1> Line 1 的使用率真的比 Line 2 好吗? boost::shared_ptr shpStr = boost::make_shared(); // Line 1 boost::sh
正如 Bjarne Stroustrup 的“C++ 之旅”中所述,作为一种已知的 C++14 实践,人们应该避免在代码中使用裸露的 new 和 delete。标准库提供 std::make_shar
这可能是重复的,但我无法在任何地方找到解决方案。 我有这样的源代码: struct Blob{ //... static void *operator new(size_t si
我有一个带有模板构造函数的类,并且想要一个 shared_pointer给它。如: class A; typedef std::shared_ptr A_ptr; class A { public:
将 VS 2015 与 v120 结合使用。 所以我得到了内存异常,因为当我在一个已经构造的对象上调用 make_shared() 时。已经构造的对象有一个指向另一个用 new 分配的对象的指针,所以
在this回答 T.C.州 boost::make_shared etc. support array types - either one of unknown size, or one of fi
虽然我有std::tr1::shared_ptr在我的编译器中可用,我不有make_shared . 谁能告诉我如何正确实现 make_shared ?我懂了我需要使用可变参数来为 T 的构造函数提供
我正在尝试自己实现 shared_ptr。 make_shared 有问题。 std::make_shared 的主要特点是它在连续的内存块中分配计数器 block 和对象。我怎样才能做同样的事情?
除非定义了 B0RKEN(就像命令行上的 -DB0RKEN 一样),否则编译以下内容: #include #include #include using boost::shared_ptr; u
有什么方法可以使用 make_shared 而不是 shared_ptr 作为抽象类型? 例子: #include #include class Foo { public: virtual
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我明白了: shared_ptr x = make_shared(); 效率高于: shared_ptr x(new X()); 而且我了解其中的优势。但是,我不明白为什么编译器不能有这样的规则 "i
使用 gcc 4.6.2,如果构造函数抛出异常,make_shared() 会给出无用的回溯(显然是由于某些重新抛出)。我正在使用 make_shared() 来节省一些输入,但这是显示停止器。我创建
从 C++11 开始,由于多种原因,开发人员倾向于将智能指针类用于动态生命周期对象。对于那些新的智能指针类、标准,甚至建议不要使用像 new 这样的运算符,而是建议使用 make_shared 或 m
从理论上讲,make_shared() 和shared_ptr 之间的一个区别是内存分配技术。 make_shared() 应该使用一个 block ,而 shared_ptr 应该使用两个 bloc
为了规避restriction on partially supplied explicit template arguments ,我将要从中推导出类模板参数 ( Internal ) 的结构嵌
为什么这个 make_shared 在两个单独的调用中分配相同的内存地址? typedef struct { int a; int b; int c; } test_t; vo
我最近正在处理 shared_ptr 的问题。我很好奇如果 make_shared 失败了,它会引发异常吗?是否存在 make_shared 返回 nullptr 但没有任何异常的情况? 最佳答案 来
我是一名优秀的程序员,十分优秀!