4 votes

pourquoi aucun constructeur n'est appelé ?

J'ai écrit une classe de test mais je n'arrive pas à comprendre ce qui se passe !

Est-ce que le Move/copy est élidé ? Si oui, comment pourrait-il être mis à jour avec la nouvelle valeur ?

Voici le cas de test (ne tenez pas compte de l'utilité)

#include<iostream>

struct Test
{
    int a;  
    Test(){a = 10;std::cout<<"def\n";}
    Test(int a){this->a = a;std::cout<<"unary\n";}
    Test(const Test& a){this->a = a.a; std::cout<<"copy\n";}
    Test(Test&& a){this->a = a.a; std::cout<<"Move\n";}
    Test& operator=(const Test& a){this->a = a.a;std::cout<<"op=\n";}
    Test& operator=(Test&& a){this->a = a.a;std::cout<<"Move=\n";}
    void display(){std::cout << "Display ";}
};   

Test gi(Test a)
{
    std::cout<<a.a<<"&\n";
    return a;
}

int main()
{
    //Test a = 99;
    //Test();
/*Line MST*/    Test b = Test(102);//gi(a);  
    std::cout<<b.a<<'\n';

return 0;
}

C'est la ligne MST que je ne comprends pas. Si je l'initialise avec un fichier temporaire Test ne devrait-il pas appeler le constructeur Move (ou au moins la copie) ?

la sortie est :

unary
102

résultat similaire avec cette ligne

 Test b = gi(Test(103));

Ici, le déplacement/la copie n'a pas lieu lors de l'appel à gi() ?

mais c'est ce à quoi je m'attendais

Test a = 99;
Test b = gi(a);

Qu'est-ce qui m'échappe ?

3voto

Andy Prowl Points 62121

Le mouvement/la copie est-il(elle) éludé(e) ? Dans l'affirmative, comment pourrait-il(elle) être mis(e) à jour avec la nouvelle valeur ?

Oui, la copie est supprimée conformément au § 12.8/31 de la norme C++11. C'est au compilateur de décider quand et si il doit effectuer cette optimisation, et vous ne devez pas vous attendre à ce qu'elle soit effectuée ou non (même si le constructeur de copie ou le constructeur de déplacement a des effets de bord).

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