unique_ptr<T>tidak mengizinkan pembuatan salinan, melainkan mendukung pemindahan semantik. Namun, saya dapat mengembalikan unique_ptr<T>dari fungsi dan menetapkan nilai yang dikembalikan ke variabel.
#include <iostream>
#include <memory>
using namespace std;
unique_ptr<int> foo()
{
unique_ptr<int> p( new int(10) );
return p; // 1
//return move( p ); // 2
}
int main()
{
unique_ptr<int> p = foo();
cout << *p << endl;
return 0;
}
Kode di atas mengkompilasi dan berfungsi sebagaimana dimaksud. Jadi bagaimana garis 1itu tidak memanggil copy constructor dan menghasilkan kesalahan kompilator? Jika saya harus menggunakan jalur, 2itu lebih masuk akal (menggunakan jalur juga 2berfungsi, tapi kami tidak diharuskan melakukannya).
Saya tahu C ++ 0x memungkinkan pengecualian ini unique_ptrkarena nilai kembali adalah objek sementara yang akan dihancurkan segera setelah fungsi keluar, sehingga menjamin keunikan pointer yang dikembalikan. Saya ingin tahu tentang bagaimana ini diterapkan, apakah itu khusus dimasukkan dalam kompiler atau ada beberapa klausa lain dalam spesifikasi bahasa yang dieksploitasi ini?
unique_ptr. Seluruh pertanyaan adalah tentang 1 dan 2 menjadi dua cara berbeda untuk mencapai hal yang sama.
mainfungsi keluar, tetapi tidak ketika fookeluar.