En général, les conteneurs STL ne peuvent pas contenir des types non-CopyAssignable
tels que des références. Si je construis le conteneur d'une manière qu'aucune copie ne devrait avoir lieu, alors le code est valide. Il compile avec std=c++11
et c++14
avec une version de gcc-7.2, mais est ce qui suit valide ou je peux m'attendre à ce qu'il casse avec une mise à niveau de bibliothèque? Dois-je utiliser reference_wrapper
dans ce cas?Est-il légal de construire une référence non tenue contenant des références?
#include <unordered_map>
struct S {};
void use (S&) {}
void test() {
S s1, s2;
const std::unordered_map<int, S&> m{{0, s1}, {1, s2}};
use(m.at(0));
}
Modifier-je vraiment besoin d'une référence à la norme. Fonctionne pour moi aussi ne suffit pas, si une mise à jour conforme à la norme de la bibliothèque du compilateur/standard peut casser le code. Donc, la réponse donnée pour "unordered_map with reference as value" ne me suffit pas.
Copie possible de [carte non triée avec référence comme valeur] (https://stackoverflow.com/questions/24719044/unordered-map-with-reference-as-value) – davidhigh
dans les conteneurs généraux nécessitent CopyAssignable non seulement pour la construction , mais aussi de nombreux algorithmes peuvent ne pas fonctionner comme prévu – user463035818