C ++ Çift Adres Operatörü? (&&)


138

STL kaynak kodunu okuyorum ve &&adres operatörünün ne yapması gerektiği konusunda hiçbir fikrim yok. İşte bir kod örneği stl_vector.h:

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

"Adresin Adresi" bir anlam ifade ediyor mu? Neden sadece bir adres yerine iki adres operatörü var?


2
Belki bir referans adresidir.
Gabe

1
@Gabe; referansın kendisi değiştirilemeyeceği için hiçbir anlam ifade etmeyen bir referansa referans olması için bir bildirimdir. Adresi, yalnızca kodda kullanılabilir, bildirirken kullanılamaz (bu durumda olduğu gibi bir parametre veya başka türlü). Yine de böyle bir şey görmedim.
falstro

5
Sadece bir tane olsa bile &, operatörün adresi ile ilgisi yoktur, bunun yerine bunun __xbir referans olduğunu belirtin .
sepp2k

Yanıtlar:


112

Bu C ++ 11 kodudur. C ++ 11'de, &&belirteç bir "değer referansı" anlamında kullanılabilir.


176

&&C ++ 11'de yeni. int&& a"a" bir r-değeri referansı anlamına gelir. &&normalde yalnızca bir işlevin parametresini bildirmek için kullanılır. Ve sadece bir r-değeri ifadesi alır. Bir r-değerinin ne olduğunu bilmiyorsanız, bunun basit açıklaması bir bellek adresinin bulunmamasıdır. Örneğin, 6 sayısı ve 'v' karakteri r-değerleridir. int a, a bir l-değeridir, ancak (a+2)bir r-değeridir. Örneğin:

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

Umut verici bu bilgilendirici.


11
Eklemek istediğim tek örnek bunun std :: move ile nasıl çalıştığıdır. int&& c = std::move( b );, Vb.
İle

2
Öyle görünüyor Sravani S pervasızca 15 Şubat 2018, tarihinde TutorialsPoint senden aşırma burada .
Gabriel Staples

3
Bu mesajı TutorialsPoint'e gönderdim . Makale, onlar tarafından intihal edildiği gibi , şuna benziyor .
Gabriel Staples

86

&&C ++ 11'de yenidir ve işlevin bir RValue-Referansını , yani yok edilmek üzere olan bir argümana başvuru kabul ettiğini belirtir .


@bronekk: Bu mesajın yayınlanma tarihini gördünüz mü? 28 Aralık 2010 itibariyle yayınlanmadı.
Billy ONeal

bunun için üzgünüm, şimdi kaldırıldı. Bir dahaki sefere daha dikkatli olacak :)
bronekk

34

Diğer yanıtların belirttiği gibi, &&bu bağlamdaki simge C ++ 0x (bir sonraki C ++ standardı) için yenidir ve bir "değer referansı" nı temsil eder.

Rvalue referansları, yaklaşan standartta daha önemli olan yeni şeylerden biridir; nesneler üzerinde 'hareket' semantiği için destek sağlar ve işlev çağrılarının mükemmel iletilmesine izin verir.

Oldukça karmaşık bir konu - en iyi tanıtımlardan biri (sadece cursory değil) Stephan T. Lavavej, "Rvalue Referansları: C ++ 0x VC10'daki Özellikler, Bölüm 2"

Makalenin hala oldukça ağır bir okuma olduğunu, ancak buna değer olduğunu unutmayın. Ve bir Microsoft VC ++ Blogunda olmasına rağmen, tüm bilgiler (veya neredeyse hepsi) herhangi bir C ++ 0x derleyicisine uygulanabilir.


&&Kendisi belirteç yeni değildir; beyanlardaki anlamı. Ama biliyordun.
aschepler

Bu bağlamda yeni. Ancak, C / C ++ 'nın jetonlarını farklı bağlamlarda farklı bir anlama sahip olacak şekilde aşırı yüklemesi oldukça gelenekseldir.
Martin York

1
@aschkleper - elbette ... mantıksal ve operatör aklıma bile girmedi. Cevabı güncelleyeceğim.
Michael Burr

5

Bunun bir hareket operatörü olduğuna inanıyorum. operator=atama operatörüdür vector x = vector y. clear()İşlev çağrısı bir bellek sızıntısı önlemek için vektör içeriğini siliyor sanki gibi geliyor. Operatör yeni vektöre bir işaretçi döndürür.

Bu yoldan,

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

Vektöre bir değer vermiş olsak da, b vektörü değerlere sahiptir. Bu büyüsü operator=()!

MSDN - Taşıma yapıcısı nasıl oluşturulur


1
Diğer 4 soruda henüz ele alınmamış olan bu 4 yaşındaki soruya cevabınız nedir?
Maskeli Adam

5
Böyle bir cevap fark etmedim, bu yüzden eklemeye karar verdim. Bu soruya bugün googling yaparak rastladım.
yash101
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.