当我声明一个变量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
包装在更有限的东西中。