为什么我可以将值可呼叫传递给参考的std ::函数

Why can I pass a value-accepting callable to a reference-accepting std::function?

本文关键字:参考 std 函数 我可以 呼叫 为什么      更新时间:2023-10-16

当我声明一个变量function<void(const Foo&)>时,编译器仍然让我分配一个接受值的lambda:

function<void(const Foo&)> handler;
handler = [](Foo f){};

(cfr。也http://cpp.sh/5dsp)

因此,当调用处理程序时,将制作副本。标准的哪一部分允许这一点?有什么方法可以标记客户端代码这将是一个问题(某些static_assert?)?

per [ func.wrap.func.con ]

std::function<R(ArgTypes...)>

template<class F> function& operator=(F&& f);

带有以下备注:

除非DECAY_T&lt; f&gt;对于参数类型ArgTypes和返回类型r。

其中

callable类型f对于参数类型可易于符合ARGTYPES,并且如果表达式Indoke&lt; rt; rt; rt; rt; rt;(dectval&lt; f&amp;&gt;(),dectval&lt;未评估的操作数,形成良好。

因此,您可以分配给std::function<R(ArgTypes...)>使用ArgTypes...的任何函数,并将某些内容隐式转换为R

我看不出如何防止将std::function包装在更有限的东西中。