为什么我不能将 std::make_unique<S> 作为函数参数传递?

Why I cannot pass std::make_unique<S> as a function parameter?

谁能给我讲清楚为什么我可以只用一个模板参数调用 std::make_unique<S>,即 S,像这样:

auto p = std::make_unique<S>(12, 13);

但是,我不能将 std::make_unique<S> 传递给函数来为我执行此操作,如下所示:

template <typename FuncType, typename ...Args >
void call_method(FuncType f, Args... args)
{
   f(std::forward<Args>(args)...);
}

struct S
{
   S(int x, int y) {}
};

int main()
{
   call_method(std::make_unique<S>, 12, 13); // not working
   // call_method(std::make_unique<S, int , int>, 12, 13); // works fine
   return 0;
}

编译器显示的错误是:

Error C2512 'S::S': no appropriate default constructor available.

我正在 Visual Studio 2017 年 Windows 10.

std::make_unique 的签名是

template<class T, class... Args>
unique_ptr<T> make_unique(Args&& ...args);

如果您直接调用 make_unique,编译器将使用模板参数推导从您调用它的内容中推断出 Args 应该是什么。通过将 std::make_unique<S> 传递给您的函数,您声明 Args 是一个空参数包,因此 std::make_unique 期望零参数并尝试默认构造一个 S。它与直接调用 std::make_unique<S>();