std::function 中的冗余构造函数重载?

Redundant constructor overloads in std::function?

根据cppreferencestd::function有以下三个构造函数重载:

template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          const function& other );
template< class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, 
          function&& other );
template< class F, class Alloc > 
function( std::allocator_arg_t, const Alloc& alloc, F f );

只留下最后一个不行吗?前两个是否会提供更好的性能(无论如何它们更专业)?如果可以,怎么实现?

TLDR:这是一个优化

前两个版本采用 std::functions 作为参数,而第三个版本采用任意可调用。采用任意可调用对象需要类型擦除,因此在调用 std::function 时最终会产生函数调用开销,并且可能需要为创建动态分配内存。

删除前两个重载将使 std::function 将另一个 std::function 视为通用可调用函数并 type-erase 该函数,因此您最终会得到一个 std::function 调用std::function 调用 std::function 并可能每次都支付动态内存分配。

相反,您以不同的方式对待 std::function,而不是存储 std::function,您只存储另一个 std::function 存储的可调用对象,从而减少间接级别和动态内存分配。