访问函数变体时"Invalid conversion"错误

"Invalid conversion" error when visiting a variant of functions

本文关键字:Invalid 错误 conversion 函数 访问      更新时间:2023-10-16

我正在尝试std::visitstd::function类型的std::variant

为什么下面的代码不编译:

#include <functional>
#include <variant>
int main()
{
std::variant<
std::function< int () >,
std::function< float () >
> func_variant {std::in_place_index<0>, [] () { return 42; }};
auto object = std::visit( [] (auto& func) { return func(); }, func_variant);
return 0;
}

错误发生在std::visit的调用中,其中说:

error: invalid conversion from ‘std::__success_type<float>::type (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’ {aka ‘float (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’} to ‘int (*)(main()::<lambda(auto:1&)>&&, std::variant<std::function<int()>, std::function<float()> >&)’ [-fpermissive]
{ return _Array_type{&__visit_invoke}; }
^

每个std::function类型都返回不同的类型,因此要传递给std::visit的 lambda 的返回类型取决于所选 lambda 元素的类型。这意味着自动类型推断不起作用,因为对std::visit的调用必须具有单个返回类型,该返回类型与变体的哪个元素处于活动状态无关。

您可以创建一个返回类型变体:using returns=std::variant<int,float>然后将 lambda 中的返回转换为该变体:

using returns=std::variant<int,float>;
auto object = std::visit( [] (auto& func) { return returns(func()); }, func_variant);

这样,lambda 的返回类型在所有情况下都是相同的,但您需要查询结果以查看您得到的内容。