【发布时间】:2014-06-16 08:42:42
【问题描述】:
#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 上看到的那样。
错误:函数参数太多...
只有当我这样做时它才有效 (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接受吗?
提前致谢。
【问题讨论】:
-
花括号初始值设定项不是表达式,也没有类型。因此
make_shared的模板类型推导无法推导出来。