为什么我可以将值可呼叫传递给参考的std ::函数
Why can I pass a value-accepting callable to a reference-accepting std::function?
当我声明一个变量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
包装在更有限的东西中。
相关文章:
- std::shared_ptr 自定义参考计数器
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- 为什么const rvalue合格的std ::可选:: value()返回const rvalue参考
- 传递对variadic-templates的引用使用std ::参考 - wrapper
- 将std ::向量作为指针参考
- std ::函数方法参考无法将dword投入到dword64
- 可以std ::移动引起切片时切入L值参考
- 为什么STD :: MOVE将RVALUE参考作为参数
- 使用std ::前进,并带有非矫正,普通的旧参考
- 尽管参数是R值参考,但为什么使用STD ::移动
- 替代STD ::向量存储参考而不是对象的副本
- C++2017 参考 std::vector<std::variant>
- rvalue参考绑定到std ::功能类型的LVALUE
- 明确给出该数字时,我应该参考std ::向量大小
- std ::移动返回和输入参考参数
- 为什么我可以将值可呼叫传递给参考的std ::函数
- 使用std ::转发参考
- STD :: BITSET ::参考对象在STD :: BITSET ::操作员[]中创建的寿命
- 通过STD :: Chrono ::按价值或参考const的持续时间
- C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考