Avec Clang 3.4, j'obtiens le même ordre de destruction pour à la fois std::pair
et std::tuple
à 2 éléments, et avec g++ 5.3 j'obtiens un ordre opposé qui pourrait être principalement dû à l'implémentation récursive de std::tuple
dans libstd++.
Donc, cela revient essentiellement à ce que j'ai dit dans le commentaire, c'est une définition spécifique à l'implémentation.
Dans le rapport de BUG :
Commentaire de Martin Sebor
Étant donné que la disposition des membres de std::pair est entièrement spécifiée, l'ordre de leur initialisation et destruction l'est également. La sortie du cas de test reflète cet ordre.
L'ordre d'initialisation (et de destruction) des sous-objets std:stuple est moins clairement spécifié. Il n'est pas immédiatement évident de ma lecture de la spécification s'il est nécessaire de respecter un ordre particulier.
La raison pour laquelle la sortie pour std::tuple avec libstdc++ est à l'envers de std::pair est parce que l'implémentation, qui repose sur l'héritage récursif, stocke et construit les éléments de tuple dans l'ordre inverse : c'est-à-dire, la classe de base, qui stocke le dernier élément, est stockée et construite en premier, suivie de chaque classe dérivée (chacune stockant le dernier élément - Nème).
La citation de la norme [section 20.4.1] à laquelle le rapporteur de bug fait référence :
1 Ce sous-clause décrit la bibliothèque de tuple qui fournit un type tuple en tant que modèle de classe tuple qui peut être instancié avec un nombre quelconque d'arguments. Chaque argument du modèle spécifie le type d'un élément dans le tuple. Par conséquent, les tuples sont des collections hétérogènes de valeurs de taille fixe. Une instantiation de tuple avec deux arguments est similaire à une instantiation de pair avec les mêmes deux arguments. Voir 20.3.
L'argument contre cela fait dans le bug lié est :
Être décrit comme similaire n'implique pas qu'ils sont identiques dans tous les détails. std::pair et std::tuple sont des classes distinctes avec des exigences différentes pour chacune. Si vous croyez qu'elles sont censées se comporter de manière identique à cet égard (c'est-à-dire, avoir leurs sous-objets définis dans le même ordre), vous devez indiquer les termes spécifiques qui le garantissent.