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.