为什么我不能将 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>();
。
谁能给我讲清楚为什么我可以只用一个模板参数调用 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>();
。