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?


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

Jawaban:


112

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


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.


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.


@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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.