Saya membuat kelas tipe chaining, seperti contoh kecil di bawah ini. Tampaknya ketika fungsi chaining anggota, maka konstruktor salinan dipanggil. Apakah ada cara untuk menghilangkan panggilan copy constructor? Dalam contoh mainan saya di bawah ini, jelas bahwa saya hanya berurusan dengan hal-hal yang bersifat sementara dan dengan demikian "harus" (mungkin tidak menurut standar, tetapi secara logis) menjadi sebuah keputusan. Pilihan terbaik kedua, untuk menyalin elision, akan menjadi untuk memindahkan konstruktor dipanggil, tetapi ini tidak terjadi.
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;
}
Sunting: Beberapa klarifikasi. 1. Ini tidak tergantung pada level optimisasi. 2. Dalam kode saya yang sebenarnya, saya memiliki objek yang lebih kompleks (misal tumpukan dialokasikan) daripada ints
auto b = test_class{7};
tidak memanggil copy constructor karena itu benar-benar sama dengan test_class b{7};
dan kompiler cukup pintar untuk mengenali kasus ini dan karena itu dapat dengan mudah menghilangkan salinan apa pun. Hal yang sama tidak dapat dilakukan untuk b2
.
std::cout
) di copy copy Anda? Tanpanya salinan harus dioptimalkan.