部分模板专业化:std::allocator_traits?

Partial template specialization for: std::allocator_traits?

是否可以像这样专门化 std::allocator_traits 模板?

namespace falloc_ {

  template<class Tp> class FAllocator ;

}

// partial spec for all falloc_::FAllocator<U>, std::allocator_traits

template<typename Tp> 
struct std::allocator_traits<falloc_::FAllocator<Tp> > {

 using allocator_type = falloc_::FAllocator<Tp> ;
 using value_type = typename allocator_type::value_type ;

 // ...
 // All the components I need here, I will include all the code if You need them.
 // ...

} ;


namespace falloc_ {

  template<class Tp> class FAllocator {

    public:
       using value_type = Tp ;
  
  } ;

}

完整代码在std++20分配器class和分配器,特性class(std::allocator_traits)规范中编译运行。在那种情况下,我的问题实际上是关于实际的正确性,是否根据对标准了解更多的人的说法,是否禁止类似功能 class 重载,或者只是假设因为(完整的)代码是可编译和可执行的并且按照预期的计划工作 - 我可以考虑使用它吗?

另外,我用代码测试了分配器:

  std::vector<int, falloc_::FAllocator<int> > mv ;

  for (size_t i = 0 ; i < 5 ; i++) {
    mv.push_back(i) ;
  }

  for (int i = 4 ; i > -1 ; i--) {
    std::cout << "mv[" << i << "]: " << mv[i] << '\n' ;
  }

内存已正确分配和释放,我还检查了 Valgrind。 使用 Gdb,我检查并从

调用了所有函数
std::allocator_traits<falloc_::FAllocator<U> > // U aka int for std::vector<int, falloc_::FAllocator<int> > 

提前感谢您的任何见解、建议和忠告。

允许特化std::allocator_traits模板。见 [namespace.std]/2:

Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.

没有明确禁止专门化 std::allocator_traits,因此您可以对您定义的类型 FAllocator 进行专门化。此规则适用于完全专业化和部分专业化。

请记住,您的专业化必须确实满足原始模板的所有 要求。该标准已经指定了每个成员类型的定义和每个成员函数的行为,以至于如果您要编写自己的专业化,它基本上与原始的相同,这违背了这样做的目的。我想您可以在不违反原始要求的情况下向 std::allocator_traits<...>::construct(...) 添加日志语句,但是将这些日志语句放在分配器本身中会更容易。如果您坚持将它们放在您的 allocator_traits 专业化中,您还必须注意不要 运行 与 [dcl.constexpr]/7.

冲突

我看不出任何情况下 std::allocator_traits 专业化是有意义的。