Rumah > Artikel > pembangunan bahagian belakang > Mengapa Pembina C 11 Move Saya Tidak Dipanggil dalam Kes Ini?
Pertimbangkan kelas berikut:
<code class="cpp">class X { public: explicit X(char* c) { cout << "ctor" << endl; init(c); }; X(X& lv) { cout << "copy" << endl; init(lv.c_); }; X(X&& rv) { cout << "move" << endl; c_ = rv.c_; rv.c_ = nullptr; }; const char* c() { return c_; }; private: void init(char *c) { c_ = new char[strlen(c)+1]; strcpy(c_, c); }; char* c_; };</code>
Dan penggunaannya:
<code class="cpp">X x("test"); cout << x.c() << endl; X y(x); cout << y.c() << endl; X z( X("test") ); cout << z.c() << endl;</code>
Outputnya ialah:
ctor test copy test ctor <-- why not move? test
Dalam VS2010, menggunakan tetapan lalai, seseorang akan menjangkakan objek terakhir (z) akan dibina bergerak dan bukannya lalai- dibina. Menggunakan X z( move(X("test")) ) menghasilkan output yang dijangkakan: ctor move test. Bolehkah ini menjadi kes NRVO?
Adakah pembina bergerak dipanggil mengikut piawaian C 11? Jika ya, mengapa ia tidak dipanggil?
Tingkah laku yang diperhatikan adalah disebabkan penyingkiran salinan. Pengkompil boleh terus membina sementara ke dalam sasaran yang hendak disalin/dialihkan ke dalamnya, sekali gus mengecualikan panggilan pembina salin/pindah dan pemusnah.
Situasi di mana penyingkiran salinan boleh digunakan digariskan dalam §12.8. 32 daripada standard C 11:
Dalam kes ini, pengkompil dapat mengenepikan operasi salinan atau alih antara X("ujian") sementara dan z sasaran, menghasilkan tingkah laku yang diperhatikan.
Atas ialah kandungan terperinci Mengapa Pembina C 11 Move Saya Tidak Dipanggil dalam Kes Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!