Je suis un peu confus, car j'étais sûr que cela devrait fonctionner différemment. Jetez un oeil à cet exemple de code:Objet non supprimé avant que le nouveau soit affecté
#include <iostream>
#include <string>
using namespace std;
class base
{
public:
virtual ~base() = default;
};
class derived : public base
{
private:
int a = 0;
int *b = nullptr;
std::string lol;
public:
derived(std::string s) : b(new int(6)), lol{s} { cout << "ctor " << lol << endl; }
derived(derived const& d) : lol{d.lol + " copy"} {cout << "copy " << lol << endl; }
virtual ~derived() { cout << "dtor " << lol << endl; delete b; }
virtual void superFunction() { cout << "OMG " << lol << endl; }
};
int main()
{
derived a("a");
derived b("b");
a = b;
}
Et la sortie du programme avec toutes les optimisations au large est:
ctor a
ctor b
dtor b
dtor b
Je suis sûr que dans ce compilateur cas devrait générer un code qui supprime l'objet a
et utilise copie constructeur pour créer un nouvel objet. Au lieu de cela, il utilise operator=
qu'il déclare implicitement.
Quelqu'un peut-il expliquer pourquoi? Ou pointez-moi à la norme C++.
Merci.
Si « le compilateur » supprime 'd'abord a', quel serait-il copier dans' b'? De toute façon, il n'y a pas de copie ici, juste une cession. – juanchopanza
en rapport: https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three – vu1p3n0x