Partage
  • Partager sur Facebook
  • Partager sur Twitter

Inserer un element non copiable std::unordered_map

Sujet résolu
    28 novembre 2019 à 7:17:38

    Bonjour,

    Comme mentionné dans le titre, je souhaite ajouter un élément non-copiable, non-déplaçable et non constructible par défaut dans un unordered_map. J'ai cru, visiblement à tort, que la méthode emplace permettait justement de faire cela en construisant directement l'objet "sur place". Le problème est qu'il se trouve qu'a un moment le constructeur par défaut de l'objet en question est appelé, sans que je ne sache où exactement et pourquoi.

    Pour le code: à partir de la ligne 44

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter

    Eug

      28 novembre 2019 à 10:24:45

      Salut,

      Je sais pas vraiment si ça vient de là, mais la ligne 35 utilise l'opérateur [] qui nécessite le constructeur par défault, comme tu le vérifies dans la ligne au dessus mais ton if n'empêche pas le code contenu de compiler, pour ça il te faut un if constexpr (je pense que ça marcherait) ou une spécialisation de template

      • Partager sur Facebook
      • Partager sur Twitter
      Dream on, Dream on, Dream until your dream comes true
        28 novembre 2019 à 10:45:04

        Hello,

        Ton objet ResourceLoader est deja construit avant vu que tu le passe en reference dans ta fonction donc ton "emplace" utilise le constructor par copie pour le reconstruire ce que est logique. Si tu veux tu peux bouger la reference de ton objet en utilisant std::move() mais assure toi de ne plus en avoir besoin apres l appelle de ta fonction.

        • Partager sur Facebook
        • Partager sur Twitter
        Quand tu regardes l'abîme, l'abîme regarde aussi en toi.
          28 novembre 2019 à 15:53:01

          romantik a écrit:

          Salut,

          Je sais pas vraiment si ça vient de là, mais la ligne 35 utilise l'opérateur [] qui nécessite le constructeur par défault, comme tu le vérifies dans la ligne au dessus mais ton if n'empêche pas le code contenu de compiler, pour ça il te faut un if constexpr (je pense que ça marcherait) ou une spécialisation de template

          Dans mon code appelant ce n'est cette surcharge que j'utilise mais effectivement if constexpr peut être utilise ici.

          NutNut tu coco a écrit:

          Hello,

          Ton objet ResourceLoader est deja construit avant vu que tu le passe en reference dans ta fonction donc ton "emplace" utilise le constructor par copie pour le reconstruire ce que est logique. Si tu veux tu peux bouger la reference de ton objet en utilisant std::move() mais assure toi de ne plus en avoir besoin apres l appelle de ta fonction.

          Si j'ai bien compris la doc de emplace, si on a une map de la forme std::map<K, T>, emplace ne s'attend pas forcement à avoir des paramètre de type K et T et l'instar de tous les std::make_* de la stl, s'attend à recevoir les paramètres necessaires à la construction de l'objet en question. Je crois que tu as fais un amalgame entre insert et emplace.

          En plus dans mon cas, le constructeur qui pose problème est celui de Resource et non celui de ResourceLoader.



          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            28 novembre 2019 à 17:03:35

            En plus du problème soulevé par romantik (présent aussi ligne 52), ta fonction get() a exactement le même comportement que try_emplace: return resources_.try_emplace(key, loader).second;

            • Partager sur Facebook
            • Partager sur Twitter

            Inserer un element non copiable std::unordered_map

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown