Maison  >  Article  >  développement back-end  >  Quels modèles de l'espace de noms `std` ne peuvent pas être spécialisés en C ?

Quels modèles de l'espace de noms `std` ne peuvent pas être spécialisés en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-31 20:13:02237parcourir

 What Templates in the `std` Namespace Cannot Be Specialized in C  ?

Restrictions sur les spécialisations std de l'espace de noms

Introduction

L'espace de noms std est crucial en C , hébergeant des bibliothèques et des modèles fondamentaux. Cependant, les utilisateurs peuvent se demander où se situe la frontière entre les personnalisations autorisées et interdites au sein de cet espace de noms. Cet article mettra en lumière les modèles qui ne peuvent pas être spécialisés dans std.

Modèles interdits

Selon la norme C, certains modèles dans std ne peuvent pas être explicitement spécialisés. Ceux-ci incluent :

  • numeric_limits : interdit pour les types standards non arithmétiques (par exemple, complexe)
  • shared_ptr : requis CopyConstructibility, CopyAssignability et LessThanComparability
  • weak_ptr : nécessite CopyConstructibility et CopyAssignability
  • std::hash : les spécialisations doivent répondre aux exigences du modèle de classe de hachage
  •  : comportement non défini pour ajouter des spécialisations pour tous les modèles de classe dans cette sous-clause (à l'exception des spécialisations common_type limitées)
  • Locales : Certains les spécialisations requises existent
  • istreambuf_iterator : nécessite un constructeur de copie trivial, un constructeur par défaut constexpr et un destructeur trivial
  • complexe : effet non défini pour l'instanciation avec d'autres types que float, double ou long double
  • atomic : nécessite un constructeur de copie supprimé, un opérateur d'affectation de copie supprimé et un constructeur de valeur constexpr
  • unary_function et binary_function : obsolète ; ne peut pas être spécialisé

Restrictions générales

Au-delà des modèles interdits, la norme C met l'accent sur les restrictions suivantes :

  • Il est comportement non défini pour déclarer ou définir quoi que ce soit dans std ou ses sous-espaces de noms, sauf indication contraire explicite.
  • Les spécialisations peuvent être ajoutées à std uniquement si elles dépendent des types définis par l'utilisateur et répondent aux exigences standard du modèle d'origine.
  • Les spécialisations explicites de fonctions membres, de modèles de fonctions membres ou de modèles de classes membres de classes de bibliothèque std sont interdites.
  • Les instanciations explicites ne sont autorisées que si elles dépendent de noms de types définis par l'utilisateur et répondent à la norme. exigences pour le modèle original.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn