Ich erstelle eine Klasse von Verkettungstypen, wie das kleine Beispiel unten. Es scheint, dass beim Verketten von Elementfunktionen der Kopierkonstruktor aufgerufen wird. Gibt es eine Möglichkeit, den Aufruf des Kopierkonstruktors loszuwerden? In meinem Spielzeugbeispiel unten ist es offensichtlich, dass ich mich nur mit Provisorien beschäftige und daher "sollte" (vielleicht nicht nach den Maßstäben, aber logisch) eine Elision sein. Die zweitbeste Wahl, um elision zu kopieren, wäre, den Verschiebungskonstruktor aufzurufen, aber dies ist nicht der Fall.
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;
}
Bearbeiten: Einige Klarstellungen. 1. Dies hängt nicht von der Optimierungsstufe ab. 2. In meinem realen Code habe ich komplexere (z. B. Heap zugewiesene) Objekte als Ints
auto b = test_class{7};
ruft den Kopierkonstruktor nicht auf, weil er wirklich gleichwertig ist test_class b{7};
und Compiler klug genug sind, um diesen Fall zu erkennen, und daher das Kopieren leicht vermeiden können. Das gleiche kann man nicht machen b2
.
std::cout
) in Ihrem Kopierer? Ohne sie sollte die Kopie weg optimiert werden.