我有以下代码:
class A {
public:
A(std::vector<std::shared_ptr<int>>){}
};
auto x = std::make_shared<int>(0);
auto y = std::make_shared<int>(1);
auto list = {x, y};
auto res = std::make_shared<A>({x, y});
在示例中,如果我将其传递给res变量列表,则它将编译,否则,如直接使用初始化列表的情况,它会失败http://ideone.com/8jYsDY
我猜想这与涉及initializer_list时类型推断的工作方式有关。如果符合标准,则可以参考。
最佳答案
std::make_shared
从参数到函数调用中推导出其第二个模板参数。括号初始化列表不是表达式,因此没有类型。因此,模板自变量推导无法从中推导类型。
从§14.8.2.5/ 5 [temp.deduct.type]
但是,auto
是一种特殊情况,允许从大括号初始列表中推断出std::initializer_list<T>
。
§7.1.6.4/ 7 [dcl.spec.auto]
在您的示例中,变量list
的类型为initializer_list<shared_ptr<int>>
,当您将其传递给make_shared
时,可以从中构造一个vector
,然后将其用于直接初始化A
实例。
其他选项是构造一个vector
auto res = std::make_shared<A>(std::vector<std::shared_ptr<int>>{x, y});
构造一个
A
,然后将其移动auto res = std::make_shared<A>(A{{x, y}});
或明确指定
make_shared
的模板参数auto res = std::make_shared<A, std::initializer_list<std::shared_ptr<int>>>({x, y});
关于c++ - 来自初始化器列表的对象初始化问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25179414/