Maison > développement back-end > C++ > Pourquoi GCC rejette-t-il la spécialisation explicite en dehors d'un espace de noms ?

Pourquoi GCC rejette-t-il la spécialisation explicite en dehors d'un espace de noms ?

DDD
Libérer: 2024-11-18 22:57:02
original
220 Les gens l'ont consulté

Why Does GCC Reject Explicit Specialization Outside of a Namespace?

Incohérence de GCC avec la norme pour la spécialisation explicite dans une portée non-espace de noms

La norme C permet explicitement de déclarer des spécialisations de modèles explicites dans n'importe quelle portée où le modèle principal correspondant peut être défini. Cependant, le comportement de GCC s'écarte de cette norme. Cette différence a été observée dans les versions récentes de GCC, où les spécialisations explicites déclarées en dehors d'un espace de noms ne parviennent pas à se compiler.

Pour illustrer le problème, considérons le code suivant :

template<typename T>
struct Widget
{
    template<typename U>
    void foo(U)
    {
    }

    template<>
    void foo(int*)
    {
    }
};
Copier après la connexion

Alors que cela le code se compile avec succès dans Clang, il rencontre une erreur dans GCC :

error: explicit specialization in non-namespace scope 'struct Widget<T>'
Copier après la connexion

Cette erreur est incompatible avec le standard C, qui autorise explicitement une spécialisation explicite dans une portée non-espace de noms. Selon le paragraphe 2 de [temp.expl.spec] dans la norme C :

"Une spécialisation explicite peut être déclarée dans n'importe quelle portée dans laquelle le modèle principal correspondant peut être défini."

Cet écart par rapport à la norme constitue un bug potentiel dans GCC. Pour signaler ce problème, suivez ces étapes :

  1. Visitez le site Web de suivi des bogues de GCC : https://gcc.gnu.org/bugzilla/
  2. Cliquez sur "Créer un nouveau rapport".
  3. Sélectionnez « Bug Assignee » dans le menu « Soumettre un nouveau rapport »
  4. Décrivez le problème clairement, y compris l'extrait de code, le message d'erreur et une référence à la section standard C pertinente ([temp.expl.spec]).
  5. Soumettez le rapport et fournissez toute information pertinente, telle que la version GCC et options du compilateur utilisées.

En signalant ce problème, vous pouvez contribuer à l'amélioration de GCC et vous assurer qu'il adhère pleinement à la norme C.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal