std :: function <std :: optional <t>()>如何与返回T的lambda兼容?

时间:2018-07-30 12:33:17

标签: c++ lambda c++17 std-function

我可以创建返回std::function的{​​{1}}并分配返回std::optional<Foo>的lambda。有人可以详细解释这是怎么可能的吗?

简单的例子:

Foo

3 个答案:

答案 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)

intstd::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>

(*)请注意,由于严格的定义涉及调用函数/概念

,因此这有点过分简化了