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 1
itu tidak memanggil copy constructor dan menghasilkan kesalahan kompilator? Jika saya harus menggunakan jalur, 2
itu lebih masuk akal (menggunakan jalur juga 2
berfungsi, tapi kami tidak diharuskan melakukannya).
Saya tahu C ++ 0x memungkinkan pengecualian ini unique_ptr
karena 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.
main
fungsi keluar, tetapi tidak ketika foo
keluar.