Mais bien sur qu'il y a un constructeur d'appeler, le but de la copy elission est déviter d'en appeler deux lorsque ce n'est pas utile.
Si tu prends
Avec operator=(const a& rhs) tu as :
- Un appel au constructeur A(int) pour construire ce temporaire
- Le passage d'une ref const sur celui-ci
- Suivi de la copie explicite via la constructeur
Sans copy ellision et avec operator=(A rhs) tu as:
- Un appel au constructeur A(int) (ou équivalent) pour construire un objet temporaire
- Puis un appel au constructeur de copie pour copier ce temporaire dans rhs
Avec copy ellision et operator=(A rhs) tu as
- Un appel au constructeur A(int) qui construit directement rhs sans passer par un temporaire.
Donc dans ce cas de figure, si le compilateur ne fait pas de copy ellision operator=(A rhs) coute la même chose que operator=(const A&) et permet de gagner un appel au constructeur de copie si le compilateur la fait.
Et dans le cas où la copy ellision n'est tout simplement pas applicable (le paramètre n'est pas un temporaire), ça coute la même chose.
Bref, comme déjà dit, operator=(A rhs), en C++03, permet dans quelques cas de gagner un appel au ctor de copie (ce qui peut être très couteux) et dans tous les autres cas ne coute pas plus cher.
Partager