“无匹配函数可调用”在创建函数变量向量时出错

问题描述 投票:2回答:2

我正在尝试创建一个可以使用std::vector容纳不同签名的std::function对象的std::variant

为什么以下代码无法编译:

#include <functional>
#include <variant>
#include <vector>

int main()
{
  std::vector<std::variant<
      std::function< int (const std::vector<float>&, int) >,
      std::function< float (const std::vector<float>&, int) >
  >> func_vector;

  func_vector.emplace_back( [] (const std::vector<float>& ret, int index) { return ret.size(); });

  return 0;
}

问题在emplace_back()期间发生。编译此命令会给出一长串错误,列出的第一个错误是:

error: no matching function for call to ‘std::variant<std::function<int(const std::vector<float, std::allocator<float> >&, int)>, std::function<float(const std::vector<float, std::allocator<float> >&, int)> >::variant(main()::<lambda(const std::vector<float>&, int)>)’
  { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

它说它找不到匹配的函数,但是究竟是什么调用?

我要放置的lambda完全具有我在变体中指定的一种类型的签名,所以一切都应该很好,不是吗?

c++ c++17 variant
2个回答
3
投票

emplace_back应该将lambda直接转发到变量初始化。并且有一个转换构造函数,可以从任何可转换为成员类型的参数中初始化变体的成员。但是,问题在于,可以从此lambda初始化变体的两个成员,从而产生歧义。


2
投票

[std::variant的转换构造函数的行为类似于重载解析,以确定要构造的类型。

© www.soinside.com 2019 - 2024. All rights reserved.