Pertanyaan C ++ Double Address Operator? (&&)


Saya membaca kode sumber STL dan saya tidak tahu apa && operator alamat yang seharusnya dilakukan. Berikut ini 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?


75
2017-12-28 20:14


asal


Jawaban:


Ini adalah C ++ 11 kode. Dalam C ++ 11, the && Token dapat digunakan untuk mengartikan "rujukan referensi".


79
2017-12-28 20:16



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


66
2017-12-28 20:16



&& baru di C ++ 11. int&& a berarti "a" adalah referensi r-nilai. && biasanya hanya digunakan untuk mendeklarasikan parameter fungsi. Dan itu hanya mengambil ekspresi nilai-r. Jika Anda tidak tahu apa itu r-value, penjelasan sederhananya adalah bahwa ia tidak memiliki alamat memori. Misalnya. angka 6, dan karakter 'v' keduanya adalah r-nilai. int aNamun, adalah l-nilai (a+2) adalah 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.


46
2017-09-13 23:05



Seperti jawaban lainnya telah disebutkan, the && Token dalam konteks ini adalah baru untuk C ++ 0x (standar C ++ berikutnya) dan mewakili "rujukan referensi".

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

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

Perhatikan bahwa artikel tersebut masih terbilang cukup berat, tetapi juga bermanfaat. Dan meskipun itu di Blog Microsoft VC ++, semua (atau hampir semua) informasi berlaku untuk setiap C ++ 0x compiler.


26
2017-12-28 20:29



Saya percaya itu adalah operator bergerak. operator= adalah operator penugasan, katakan vector x = vector y. Itu clear() fungsi panggilan suara seperti seolah-olah 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 memberi vektor nilai, vektor b memiliki nilai. Ini keajaiban dari operator=()!

MSDN - Cara membuat konstruktor bergerak


1
2017-12-23 16:43