Sto creando una classe di tipo concatenamento, come il piccolo esempio di seguito. Sembra che quando si concatenano funzioni membro, viene invocato il costruttore di copie. C'è un modo per sbarazzarsi della chiamata del costruttore della copia? Nel mio esempio di giocattolo qui sotto, è ovvio che ho a che fare solo con i provvisori e quindi "dovrebbe" (forse non secondo gli standard, ma logicamente) essere un'elezione. La seconda scelta migliore, per copiare l'elisione, sarebbe quella di chiamare il costruttore di mosse, ma non è così.
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;
}
Modifica: alcuni chiarimenti. 1. Questo non dipende dal livello di ottimizzazione. 2. Nel mio codice reale, ho oggetti più complessi (ad es. Allocazione di heap) rispetto agli ints
auto b = test_class{7};
non chiama il costruttore di copie perché è veramente equivalente test_class b{7};
e i compilatori sono abbastanza intelligenti da riconoscere questo caso e possono quindi facilmente eludere qualsiasi copia. Lo stesso non si può fare per b2
.
std::cout
) nel tuo ctor copia? Senza di essa, la copia dovrebbe essere ottimizzata.