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

时间:2019-12-19 00:08:07

标签: 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; } );
}

编译器显示template argument deduction/substitution failed。 谁能解释为什么它无法编译?

1 个答案:

答案 0 :(得分:8)

无法编译,因为需要为std::variant::emplace赋予Emplace的替代版本的类型或索引:

#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<ret_int>([](){ return 1; });
}

std::variant::emplace [variant.mod]所有重载的第一个模板参数是emplace的变体的索引或类型。这些重载都不能以可推断的方式使用此参数……