2016-12-09 1 views
4

Un fil sur SO dit que extending std is UB (ok, sauf si vous êtes les écrivains standard bien sûr). Mais de temps en temps, std est heureusement étendu. Quand est-ce que c'est OK?C++ Quand est-il correct d'étendre l'espace de noms `std`?

+0

related/dupe: http://stackoverflow.com/questions/320798/adding-types-to-the-std-namespace – NathanOliver

+0

@NathanOliver, mais pas un dupe. Je serais surpris si c'est une question entièrement nouvelle. Mais c'est certainement un bon. – Walter

+0

Ce que vous pouvez certainement faire est de fournir des spécialisations pour certains modèles, par exemple 'std :: numeric_limits '. – Walter

Répondre

5

Le seul cas où il est OK pour ajouter une définition dans l'espace de noms std est la spécialisation d'un modèle qui existe déjà dans l'espace de noms et instancier explicitement un modèle . Cependant, seulement s'ils dépendent d'un type défini par l'utilisateur.

[namespace.std] (projet de norme):

  1. Le comportement d'un programme C++ est indéfini si elle ajoute des déclarations ou des définitions de l'espace de noms std ou à un espace de noms dans les namespace std, sauf indication contraire. Un programme peut ajouter une spécialisation de modèle pour n'importe quel modèle de bibliothèque standard à l'espace de noms std uniquement si la déclaration dépend d'un type défini par l'utilisateur et si la spécialisation répond aux exigences de bibliothèque standard pour le modèle d'origine et n'est pas explicitement interdite.

  2. Le comportement d'un programme C++ est pas défini si elle déclare

    (2,1) une spécialisation explicite de toute fonction de membre d'un modèle standard de classe de bibliothèque ou

    (2,2) une spécialisation explicite de tout (2.3) une spécialisation explicite ou partielle de n'importe quel modèle de classe de membre d'une classe ou d'un modèle de classe de bibliothèque standard.

    Un programme peut explicitement instancier un modèle défini dans la bibliothèque standard uniquement si la déclaration dépend du nom d'un type défini par l'utilisateur et si l'instanciation répond aux exigences de la bibliothèque standard pour le modèle d'origine.


À titre d'exemple des modèles standards qui sont conçus explicitement être étendue pour les types définis par l'utilisateur: std::hash et std::iterator_traits.

+0

copie simple de cppreference ... – Walter

+0

Merci, j'étais sur le point de demander à @ Jarod42 la liste de "ceux de" std "qui l'attendent" mais c'est assez bon. –

+0

J'étend l'espace de noms 'std' avec la fonction' make_unique' pour C++ 11 comme il est écrit [ici] (http://stackoverflow.com/questions/17902405/how-to-implement-make-unique-function-in -c11). Est-ce correct? –

2

Vous pouvez mettre des spécialisations de modèle pour vos types de données personnalisés.

A titre d'exemple: vos propres specialzations de std::hash pour std::unordered_map