如何解决与 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::function
、shared_ptr
、allocate_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中移除),它们是采用分配器的函数;在这种情况下,构造函数是一个函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。