Je crée une classe de type chaînage, comme le petit exemple ci-dessous. Il semble que lors du chaînage des fonctions membres, le constructeur de copie soit invoqué. Existe-t-il un moyen de se débarrasser de l'appel du constructeur de copie? Dans mon exemple de jouet ci-dessous, il est évident que je ne traite que des temporaires et donc il "devrait" (peut-être pas selon les normes, mais logiquement) être une élision. Le deuxième meilleur choix, pour copier l'élision, serait d'appeler le constructeur de déplacement, mais ce n'est pas le cas.
class test_class {
private:
int i = 5;
public:
test_class(int i) : i(i) {}
test_class(const test_class& t) {
i = t.i;
std::cout << "Copy constructor"<< std::endl;
}
test_class(test_class&& t) {
i = t.i;
std::cout << "Move constructor"<< std::endl;
}
auto& increment(){
i++;
return *this;
}
};
int main()
{
//test_class a{7};
//does not call copy constructor
auto b = test_class{7};
//calls copy constructor
auto b2 = test_class{7}.increment();
return 0;
}
Edit: Quelques clarifications. 1. Cela ne dépend pas du niveau d'optimisation. 2. Dans mon vrai code, j'ai des objets plus complexes (par exemple alloués par tas) que des entiers
auto b = test_class{7};
n'appelle pas le constructeur de copie car il est vraiment équivalent à test_class b{7};
et les compilateurs sont assez intelligents pour reconnaître ce cas et peuvent donc facilement éluder toute copie. On ne peut pas faire la même chose b2
.
std::cout
) dans votre ctor de copie? Sans cela, la copie devrait être optimisée.