我正在尝试创建一个可以使用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完全具有我在变体中指定的一种类型的签名,所以一切都应该很好,不是吗?
emplace_back
应该将lambda直接转发到变量初始化。并且有一个转换构造函数,可以从任何可转换为成员类型的参数中初始化变体的成员。但是,问题在于,可以从此lambda初始化变体的两个成员,从而产生歧义。
[std::variant
的转换构造函数的行为类似于重载解析,以确定要构造的类型。