与 STL 和 std::basic_string 不同,为什么 std::function 没有默认分配器

问题描述

与 STL 和 std::basic_string 不同,std::function 没有认分配器。为什么?

在 C++11 中没有 std::function认分配器。 但是这篇文章https://docs.microsoft.com/en-us/cpp/standard-library/allocators?view=msvc-160)持有相反的观点,它说:

在 C++11 中,所有采用分配器类型参数的标准库类型和函数支持最小分配器接口,包括 std::functionshared_ptrallocate_shared() 和 {{1 }}。

basic_string

解决方法

在 C++11 及更高版本中,最常用的非默认构造函数是这个:

my_fun(data,Var1) - 5

我将在此讨论中忽略其他人,因为它们不太有趣,但相同的信息适用于它们。

在 C++11 和 C++14 中也有这个,但在 C++20 中被删除了:

template<class F> function(F);

您的问题是为什么在 C++11 和 C++14 中它没有 this 而不是上面的构造函数:

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

答案是没有办法使用默认参数调用这样的构造函数,因为template<class F,class Alloc> function(F,const Alloc& = Alloc()); 总是调用第一个构造函数,而C++没有办法指定function(f)模板参数.有关 C++ 限制的更多信息,请参见此处:Can the template parameters of a constructor be explicitly specified?

像 std::vector 这样的许多其他类型是不同的,因为它们的分配器模板参数在整个类类型上,而不仅仅是在其构造函数上。

,

我假设您知道 std::function 中的分配器支持已在 C++17 中删除,因此我的回答将涵盖 C++11 和 C++14,其中 caveat 为:

std::function 的分配器支持没有详细说明并且实现不一致。一些实现 [did] 根本不提供重载 (6-10),一些提供 [d] 重载但忽略 [d] 提供的分配器参数,一些提供 [d] 重载并使用 [d] 提供的分配器用于构造,但不是在 std::function [wa] 重新分配时。

在 C++11 和 C++14 中,std::function 没有分配器模板参数,因为它不需要。所有将调用分配器的成员也接受分配器作为函数(构造函数)模板参数;并且由于 std::function 对包装的可调用对象执行类型擦除,因此对分配器执行类型擦除也很简单。

在 Microsoft 文档中(我的重点):

在 C++11 中,所有采用分配器类型参数的标准库类型和函数都支持最小分配器接口,包括 std::function、[...]

这是指std::function构造函数采用分配器参数(在C++17中移除),它们是采用分配器的函数;在这种情况下,构造函数是一个函数。