Using `std::function` to call non-void function

后端 未结 3 776
一个人的身影
一个人的身影 2020-11-28 15:53

A while ago I used std::function pretty much like this:

std::function func = [](int i) -> int { return i; };
3条回答
  •  再見小時候
    2020-11-28 16:14

    Your use case is well-defined according to the standard.

    You are constructing a std::function from a callable object[1]

    §20.8.11.2.1/7:

    template function(F f);
    

    Requires: F shall be CopyConstructible. f shall be Callable (20.8.11.2) for argument types ArgTypes and return type R.

    So is your f callable?

    §20.8.11.2/2 says:

    A callable object f of type F is Callable for argument types ArgTypes and return type R if the expres- sion INVOKE (f, declval()..., R), considered as an unevaluated operand (Clause 5), is well formed (20.8.2).

    And the definition of INVOKE says:

    §20.8.2

    1. Define INVOKE (f, t1, t2, ..., tN) as follows: ... stuff dealing with member function/var pointers ... — f(t1, t2, ..., tN) in all other cases.

    2. Define INVOKE (f, t1, t2, ..., tN, R) as INVOKE (f, t1, t2, ..., tN) implicitly converted to R.

    And since any type can be implicitly converted to void, your code should be fine with a standards-conforming compiler. As pointed out by litb below, there isn't an implicit conversion to void so this isn't well defined.

    [1]: I think the lambda counts as a callable object here, although I don't have a reference for that. Your lambda could also be used as a function pointer as it captures no context

提交回复
热议问题