Question

La bibliothèque standard comprend un en-tête de <iosfwd> que (avant) déclare tous les courants, y compris les typedefs et définit le modèle de char_traits, y compris les spécialisations.

Malheureusement, il n'y a pas de tête de <stlfwd> qui (avant) déclare tous les types de données STL et fonctions communes comme vector, map, less, sort, etc. Plus encore, malheureusement, le code utilisateur ne peut pas ajouter de telles déclarations / typedefs à l'espace de noms std, selon

§17.4.3.1 [lib.reserved.names] p1:

Il est pas défini pour un C + + programme pour ajouter déclarations ou définitions à l'espace de noms std ou dans les espaces de noms std d'espace de noms, sauf indication contraire. Un programme peut ajouter des spécialisations de modèle pour tout modèle standard d'espace de noms std.

Yep, qui couvre le cas des déclarations (en avant), même si les types existent déjà dans la bibliothèque standard. Bien sûr, la plupart (tous?) Compilateurs se comporteront même tout à fait normal si l'on ajoute ces déclarations, mais strictement et l'avocat de langue parlant, il est un comportement non défini. Je trouve cela particulièrement pénible pour typedefing conteneurs standard, comme:

// how to forward declare map and string?

typedef std::map<std::string, std::string> Attributes;

Maintenant, cela peut être considéré comme un défaut?

Je veux dire à la fois la non-existence d'un en-tête de <stlfwd> (ou mieux, <stdfwd>, couvrant <iosfwd> aussi) et l'interdiction des déclarations déjà existantes dans la bibliothèque standard.

En outre, selon cette question , si l'on (avant) déclare le conteneur standard, les algorithmes et foncteurs / fonctionnelles exactement comme exigé par la norme, le code doit être parfaitement valide (s'il n'y avait pas l'interdiction des déclarations faites par l'utilisateur dans l'espace de noms std), parce que les mises en œuvre aren » t a permis d'ajouter des paramètres de modèle cachés / en défaut.

Je demande cela parce que je pense à la suite de présenter un rapport de défaut à ce sujet.

Était-ce utile?

La solution

Quel serait le but de déclarer l'avant ou dire less sort ou vraiment tout autre algorithme? Si vous passez un algorithme d'usage général autour d'elle sera presque certainement comme un type de modèle et pas besoin d'une déclaration avant du tout.

Cela nous laisse avec les types de conteneurs. Il y a certainement des cas où les déclarations avant d'entre eux seraient utiles, mais je soupçonne qu'il a été simplement décidé que la définition de chaque conteneur est relativement simple (par rapport à iostreams) il serait préférable d'utiliser simplement la pleine comprennent plutôt qu'un comprennent par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top