C ++ Operator Alamat Ganda? (&&)

137

Saya membaca kode sumber STL dan saya tidak tahu apa &&yang seharusnya dilakukan oleh operator alamat. Ini adalah contoh kode dari stl_vector.h:

vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
    // NB: DR 675.
    this->clear();
    this->swap(__x); 
    return *this;
}

Apakah "Alamat Alamat" masuk akal? Mengapa ia memiliki dua operator alamat, bukan hanya satu?

Anarki
sumber
2
Mungkin itu alamat referensi.
Gabe
1
@ Gabe; itu adalah deklarasi sehingga akan menjadikannya referensi ke referensi, yang tidak masuk akal karena referensi itu sendiri tidak dapat dimodifikasi. Alamat-hanya dapat digunakan dalam kode, bukan ketika mendeklarasikan (parameter seperti dalam kasus ini, atau sebaliknya). Tapi belum pernah melihat yang seperti ini.
falstro
5
Bahkan jika hanya ada satu &, itu tidak akan ada hubungannya dengan alamat-operator, tetapi menandakan bahwa itu __xadalah referensi.
sepp2k
1
Kemungkinan duplikat dari Apa yang dimaksud dengan T&& (ampersand ganda) dalam C ++ 11?
Trevor Boyd Smith

Jawaban:

112

Ini adalah kode C ++ 11 . Dalam C ++ 11, &&token dapat digunakan untuk berarti "referensi nilai".

aschepler
sumber
175

&&baru dalam C ++ 11. int&& aberarti "a" adalah r-value reference. &&biasanya hanya digunakan untuk mendeklarasikan parameter suatu fungsi. Dan itu hanya membutuhkan ekspresi r-value. Jika Anda tidak tahu apa nilai-r, penjelasan sederhananya adalah ia tidak memiliki alamat memori. Misalnya angka 6, dan karakter 'v' keduanya r-nilai. int a, a adalah nilai l, namun (a+2)merupakan nilai r. Sebagai contoh:

void foo(int&& a)
{
    //Some magical code...
}

int main()
{
    int b;
    foo(b); //Error. An rValue reference cannot be pointed to a lValue.
    foo(5); //Compiles with no error.
    foo(b+3); //Compiles with no error.

    int&& c = b; //Error. An rValue reference cannot be pointed to a lValue.
    int&& d = 5; //Compiles with no error.
}

Harapan itu informatif.

Lexseal Lin
sumber
11
Satu-satunya contoh yang saya harap Anda tambahkan adalah cara kerjanya dengan std :: move. Menampilkan apa yang akan terjadi int&& c = std::move( b );, dll.
Zzzach ...
2
Sepertinya Sravani S menjiplak secara terang-terangan dari Anda untuk TutorialsPoint pada 15 Februari 2018, di sini .
Gabriel Staples
3
Saya baru saja mengirim TutorialsPoint pesan ini . Artikel, seperti dijiplak oleh mereka, terlihat seperti ini .
Gabriel Staples
86

&&baru dalam C ++ 11, dan itu menandakan bahwa fungsi menerima RValue-Referensi - yaitu, referensi ke argumen yang akan dihancurkan.

Billy ONeal
sumber
@bronekk: Apakah Anda melihat tanggal posting pada pesan ini? Itu tidak diterbitkan pada 28 Desember 2010.
Billy ONeal
maaf soal itu, hapus sekarang. Akan lebih berhati-hati lain kali :)
bronekk
34

Seperti jawaban lain yang disebutkan, &&token dalam konteks ini adalah baru untuk C ++ 0x (standar C ++ berikutnya) dan mewakili "referensi nilai".

Referensi nilai adalah salah satu hal baru yang lebih penting dalam standar yang akan datang; mereka memungkinkan dukungan untuk 'memindahkan' semantik pada objek dan memungkinkan penerusan panggilan fungsi yang sempurna.

Ini adalah topik yang agak rumit - salah satu perkenalan terbaik (yang tidak hanya sepintas) adalah artikel oleh Stephan T. Lavavej, "Rvalue Referensi: C ++ 0x Fitur di VC10, Bagian 2"

Perhatikan bahwa artikel tersebut masih cukup banyak dibaca, tetapi juga bermanfaat. Dan meskipun itu ada di Microsoft VC ++ Blog, semua (atau hampir semua) informasinya berlaku untuk kompiler C ++ 0x apa pun.

Michael Burr
sumber
The &&Token itu sendiri bukanlah hal baru; artinya dalam deklarasi adalah. Tapi kamu tahu itu.
aschepler
Ini baru dalam konteks ini. Tapi itu sangat tradisional untuk C / C ++ untuk membebani tokennya untuk memiliki makna yang berbeda dalam konteks yang berbeda.
Martin York
1
@aschkleper - tentu saja ... operator logika dan bahkan tidak memasuki pikiran saya. Saya akan memperbarui jawabannya.
Michael Burr
5

Saya percaya bahwa ini adalah operator bergerak. operator=adalah operator penugasan, katakanlah vector x = vector y. The clear()fungsi panggilan terdengar seperti seolah-olah itu adalah menghapus isi vektor untuk mencegah kebocoran memori. Operator mengembalikan pointer ke vektor baru.

Cara ini,

std::vector<int> a(100, 10);
std::vector<int> b = a;
for(unsigned int i = 0; i < b.size(); i++)
{
    std::cout << b[i] << ' ';
}

Meskipun kami memberikan nilai vektor, vektor b memiliki nilai. Ini keajaiban operator=()!

MSDN - Cara membuat konstruktor bergerak

yash101
sumber
1
Apa jawaban Anda yang ditambahkan ke pertanyaan berusia 4 tahun ini, yang belum tercakup dalam jawaban lain?
Masked Man
5
Saya tidak melihat jawaban seperti ini jadi saya memutuskan untuk menambahkan. Saya menemukan pertanyaan ini hanya dengan googling hari ini.
yash101