访问函数变体时"Invalid conversion"错误
"Invalid conversion" error when visiting a variant of functions
我正在尝试std::visit
std::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 的返回类型在所有情况下都是相同的,但您需要查询结果以查看您得到的内容。
相关文章:
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++模板错误:"invalid explicitly-specified argument for template parameter"
- SDL_CreateTextureFromSurface() "Invalid texture"错误?
- 如何'Invalid conversion'和'no match for operator'更正这些 c++ 错误
- 访问函数变体时"Invalid conversion"错误
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 模板类和'invalid use of incomplete type'错误
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- 错误"invalid types ... for array subscript"是什么意思?
- Java 本机访问代码错误:"Invalid memory access"
- 封送C++交错数组会产生"Invalid managed/unmanaged type combination"错误
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 为什么我的重载 + 运算符在返回时会产生"Invalid address specified to RtlValidateHeap"错误?
- 如何修复代码中的"Invalid memory reference"错误?
- C++抛出错误"Invalid special open parenthesis."中的正则表达式
- 模板类错误的向量:"Template argument 2 is invalid"
- 如何避免"invalid initialization of reference" C++中琐碎函子的错误
- 让编译器告诉哪些方法不具体,而不是错误'invalid new-expression of abstract class type'
- map.insert:"Invalid arguments"错误与 pair<enum,vector<*>>
- 尝试执行任何需要它的操作时,无法修复 WinAPI 中的"invalid handle"错误