我可以创建返回std::function
的{{1}}并分配返回std::optional<Foo>
的lambda。有人可以详细解释这是怎么可能的吗?
简单的例子:
Foo
答案 0 :(得分:4)
constructor of std::optional
(过载集中的#8)是有条件显式的,具体取决于模板参数。对于您的情况(std::optional<int>
,您可以隐式构造实例,
std::optional<int> opt;
opt = 42; /* No problem, implicit construction. */
这正是包装器std::function<std::optional<int>>
的作用。它调用包装的函数,该函数返回一个int
,并使用此返回值隐式构造自己的返回值std::optional<int>
。
答案 1 :(得分:4)
从int
到std::optional<int>
的隐式转换。
std::function
的模板构造函数使用命名的需求Callable,它仅要求INVOKE
表达式可隐式转换为结果类型,而不是相同的类型。 / p>
答案 2 :(得分:2)
简而言之,分配给std::function
的目标必须可以调用std::function
的参数和模板参数的返回类型。
例如鉴于:
std::function<R(P1, P2)>
p1
的P1
p2
的P2
如果f
格式正确并且可以隐式转换为f(p1, p2)
,则可以为其分配目标R
。 (*)
其他答案表明std::optional<int>
可以从int
隐含地理解。
因此,在您的示例中,[&] () -> int {return k;}()
返回一个int
,并且可以隐式转换为std::optional<int>
。
(*)请注意,由于严格的定义涉及调用函数/概念
,因此这有点过分简化了