【发布时间】:2023-04-10 15:23:02
【问题描述】:
以下代码无法编译:
#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。
谁能解释为什么编译失败?
【问题讨论】:
-
我认为 lambda 不是 std::fction 类型,而是具有独特类型的函子
-
我的经验是类型擦除(
std::function用来存储不同的可调用事物)和模板类型推导不能优雅地混合。您可能能够摆脱显式构造std::function并使用 CTAD 仍然允许类型推导。像var.emplace(std::function{[](){ return 1; }});这样的东西对我有用,也可能对你有用。
标签: c++ variant std-function