C++ 具有不同返回类型的函数的变体

C++ 具有不同返回类型的函数的变体,c++,variant,std-function,C++,Variant,Std Function,以下代码未编译: #include <functional> #include <variant> int main() { using ret_void = std::function<void()>; using ret_int = std::function<int()>; std::variant<ret_void, ret_int> var; var.emplace([](){ return 1; } )

以下代码未编译:

#include <functional>
#include <variant>

int main() {
  using ret_void = std::function<void()>;
  using ret_int  = std::function<int()>;

  std::variant<ret_void, ret_int> var;
  var.emplace([](){ return 1; } );
}
#包括
#包括
int main(){
使用ret_void=std::函数;
使用ret_int=std::function;
std::variant-var;
var.emplace([](){return 1;});
}
编译说
模板参数推断/替换失败

有人能解释一下为什么无法编译吗?

之所以无法编译,是因为需要提供替代emplace的变体的类型或索引:

#包括
#包括
int main(){
使用ret_void=std::函数;
使用ret_int=std::function;
std::variant-var;
var.emplace([](){return 1;});
}

std::variant::emplace
的所有重载的第一个模板参数是emplace替代变量的索引或类型。这些重载中没有一个使用此参数的方式会使其可推断…

我认为lambda不是std::fuction类型,而是一个具有唯一类型的functor。我的经验是类型擦除(正如
std::function
用于存储不同的可调用内容)和模板类型的演绎不雅致地混合。您可以显式地构造
std::function
,并使用CTAD仍然允许类型推断。类似于
var.emplace(std::function{[](){return1;}})对我有用,可能对你有用。