Bonjour à tous,

je lisais récemment l'article de Andreas et Masur sur les allocateurs et je suis allé voir l'implémentation de l'allocateur par défaut de la STL (gcc-g++-4.6.3.tar.gz pour être exact).

Dans le fichier d'en-tête allocator.h, on y trouve bien tout ce qui est expliqué dans l'article (typedef, spécialisation pour le type void, ...). Jusque ici, tout va bien... Puis apparaissent les quelques lignes suivantes:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
  // Inhibit implicit instantiations for required instantiations,
  // which are defined via explicit instantiations elsewhere.
#if _GLIBCXX_EXTERN_TEMPLATE
  extern template class allocator<char>;
  extern template class allocator<wchar_t>;
#endif
Les instanciations spécialisées pour les types char et wchar_t apparaissent dans le fichier allocator-inst.cc,

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
namespace std
{
  template class allocator<char>;
  template class allocator<wchar_t>;
} // namespace std
La seule conséquence que je vois à ces spécialisations particulières est d'empêcher l'utilisateur de spécialiser lui-même les allocateurs pour char et pour wchar_t.

  1. Est-ce le cas ou bien n'ai-je rien compris?
  2. Y a-t-il d'autres conséquences/avantages à faire cela?
  3. Pourquoi ne faire cela que pour les type char et wchar_t et pas pour d'autres types de base (int, float, ...)?


Mes questions sont peut-être naïves (désolé dans ce cas) mais j'aimerais bien comprendre ce qui motive ce choix pour les développeurs de la STL. Si certains peuvent éclairer ma lanterne, merci d'avance!