C++ 存储一个C++;20来自转发引用的类似于函数的对象?

C++ 存储一个C++;20来自转发引用的类似于函数的对象?,c++,c++20,C++,C++20,在C++20中,假设我想std::make_unique一个副本(或根据需要移动),并存储一个类似于函数的对象,该对象在转发引用中传递 template<typename F> std::unique_ptr<???> make_copy_of_functor(F&& f) { return std::make_unique<???>(std::forward<F>(f)); } 还是我需要用某种方式来腐蚀它?(我可能对转

在C++20中,假设我想
std::make_unique
一个副本(或根据需要移动),并存储一个类似于函数的对象,该对象在转发引用中传递

template<typename F>
std::unique_ptr<???> make_copy_of_functor(F&& f) {
    return std::make_unique<???>(std::forward<F>(f));
}

还是我需要用某种方式来腐蚀它?(我可能对转发引用的引用折叠规则感到困惑。)

作为转发引用,当传递左值
F
将被推断为左值引用时,您可以使用删除引用部分(并为函数类型添加指针)

模板
自动生成\u复制\u函子(F&&F){
返回std::make_unique(std::forward(f));
}

您可以按值传递,然后移动到新对象中:

template <typename F>
auto make_copy_of_functor(F f) {
  return std::make_unique<F>(std::move(f));
}
模板
自动生成\u复制\u函子(F){
返回std::make_unique(std::move(f));
}

实际上我得到了
错误:new不能应用于函数类型
当用于普通函数时,我猜转发引用引用了函数,而没有应用函数到指针的标准转换。如果我使用make_copy_of_functor(&my_函数),它会工作。也许
std::decay
更好?不确定。@AndrewTomazos是的,我们需要将
F
显式设置为函数指针类型<代码>复制函数(&my函数)就是这样做的。是的,
std::decay
似乎更好。是的,如果我们使用
std::decay
,那么
make_copy_of_functor(我的函数)
可以工作(没有
&
)。与其他解决方案相比,这难道不是双倍的移动吗?一个移动到函数参数中,然后另一个移动到构造函数中?或者其中一个被省略了?是的。如果通过右值传递,这将调用两个移动操作,否则将调用一个复制操作和一个移动操作。但是move操作很便宜,而且这个代码看起来更整洁(这可能不太容易出错)。
template<typename F>
auto make_copy_of_functor(F&& f) {
    return std::make_unique<std::decay_t<F>>(std::forward<F>(f));
}
template <typename F>
auto make_copy_of_functor(F f) {
  return std::make_unique<F>(std::move(f));
}