Aşağıdaki küçük örnek gibi bir zincirleme türü sınıfı oluşturuyorum. Üye işlevlerini zincirlerken, kopya oluşturucu çalıştırılır. Kopya oluşturucu çağrısından kurtulmanın bir yolu var mı? Aşağıdaki oyuncak örneğimde, sadece geçici işlerle uğraştığım ve bu nedenle "zorunluluk" (belki standartlara göre değil, mantıksal olarak) bir eleme olduğu açıktır. Seçimi kopyalamak için ikinci en iyi seçenek, hareket yapıcısının çağrılmasıdır, ancak durum böyle değildir.
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;
}
Düzenleme: Bazı açıklamalar. 1. Bu, optimizasyon seviyesine bağlı değildir. 2. Benim gerçek kod, ints daha karmaşık (örn. Öbek tahsis) nesneleri var
auto b = test_class{7};
kopya yapıcısını çağırmaz çünkü test_class b{7};
derleyiciler bu durumu tanıyacak kadar akıllıdır ve bu nedenle herhangi bir kopyalamayı kolayca kaldırabilirler. Aynı şey yapılamaz b2
.
std::cout
Kopyalama kasanızda aslında G / Ç ( ) var mı? Bu olmadan kopya optimize edilmelidir.