44 votes

Pourquoi std::pair d'un objet anonyme copie cet objet au lieu de le déplacer ?

J'ai essayé de faire std::pair avec ce style :

 #include <iostream>

struct A {
    A() noexcept {
        std::cout << "Created\n";
    }
    A(const A&) noexcept {
        std::cout << "Copy\n";
    }
    A(A&&) noexcept {
        std::cout << "Move\n";
    }
};

int main() {
    std::pair<A, A> a{ {},{} };
    return 0;
}

et obtenu une telle sortie:

 Created
Created
Copy
Copy

à la place de

 Created 
Created
Move
Move

Mais si je définis mon type d'objet anonyme (par exemple std::pair<A, A> a{A{}, A{}} ) ou utilisez std::make_pair<A, A>({}, {}) j'obtiens le bon résultat.

std::pair doit utiliser std::forward<U1> et std::forward<U2> pour initialiser les objets, donc je pense que ma paire utilise un mauvais constructeur. Pourquoi?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X