web-dev-qa-db-fra.com

Pourquoi un espace de noms sans nom est une alternative "supérieure" à statique?

La section $ 7.3.1.1/2 de la norme C++ se lit comme suit:

L'utilisation du mot clé statique est déconseillée lors de la déclaration d'objets dans une étendue d'espace de noms; l'espace de noms sans nom fournit une alternative supérieure.

Je ne comprends pas pourquoi un espace de noms sans nom est considéré comme une alternative supérieure? Quelle est la justification? Je sais depuis longtemps ce que dit la norme, mais je n'y ai jamais sérieusement réfléchi, même lorsque je répondais à cette question: Supériorité de l'espace de noms sans nom sur statique?

Est-il considéré comme supérieur car il peut également être appliqué à des types définis par l'utilisateur, comme je l'ai décrit dans mon réponse ? Ou y a-t-il une autre raison, que je ne connais pas? Je pose cette question, en particulier parce que c'est mon raisonnement dans ma réponse, alors que la norme pourrait avoir autre chose en tête.

82
Nawaz
  • Comme vous l'avez mentionné, l'espace de noms fonctionne pour n'importe quoi, pas seulement pour les fonctions et les objets.
  • Comme l'a souligné Greg, static signifie déjà trop de choses.
  • Les espaces de noms offrent un moyen uniforme et cohérent de contrôler la visibilité à l'échelle mondiale. Vous n'avez pas besoin d'utiliser différents outils pour la même chose.
  • Lorsque vous utilisez un espace de noms anonyme, le nom de la fonction/de l'objet sera correctement modifié, ce qui vous permet de voir quelque chose comme "(espace de noms anonyme) :: xyz" dans la table des symboles après la déstructuration, et pas seulement "xyz" avec une liaison statique .
  • Comme indiqué dans les commentaires ci-dessous, il n'est pas autorisé d'utiliser des éléments statiques comme arguments de modèle, tandis qu'avec des espaces de noms anonymes, c'est bien.
  • Plus? Probablement, mais je ne peux penser à rien d'autre pour le moment.
90
Sergei Tachenov

Une raison peut être que static a déjà trop de significations (je peux en compter au moins trois). Puisqu'un espace de noms anonyme peut encapsuler n'importe quoi, y compris des types, il semble supérieur à la solution static.

9
Greg Hewgill

Je pense qu'il y a deux raisons:

  • static a deux significations différentes: à portée de classe, cela signifie partagé par toute la classe tandis qu'à portée de fichier/fonction, cela affecte la visibilité/stockage ...
  • les espaces de noms sans nom permettent de déclarer de nouveaux struct, class et typedef

Une remarque cependant, le comité a reculé sur ce point: static n'est plus marqué comme obsolète dans n3225.

7
Matthieu M.

Quelles que soient les raisons qu'ils avaient, ils ont changé d'avis: http://crazycpp.wordpress.com/2011/01/18/static-keyword-is-back/

4
Edward Strange