我有以下代码:

    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/

10-15 00:32