2015-10-02 15 views
8

Neden ön artış çalışıyor, ancak artış sonrası bir referans değişkeninde yok?Referans değişkeni üzerindeki işleç artırıcısı

#include <iostream> 

void swap(int&, int&); 

int main() 
{ 
    int x=10, y=20; 
    int &a=x, &b=y; 
    swap(++a, ++b); //swap (a++,b++) is not allowed. 
    printf("%d %d ", a, b); 
    return 0; 
} 

void swap(int& x, int& y) 
{ 
    x+=2; 
    y+=3; 
} 

neden swap(++a, ++b) izin verilir, ancak swap(a++, b++) edenler:

[hata] Çeşidi const olmayan referans geçersiz başlatma türü 'int'

+0

Basitlik için, 'main' x' ve 'y' doğrudan kullanmaya çalıştığınızda aynı davranışın gerçekleştiğine dikkat edin. “A” ve “b” referansları sadece problemin olduğundan daha karmaşık görünmesine hizmet eder. –

cevap

8
bir rvalue gelen '& int'

a++ ve b++, art artırma önceki değerleri döndürdüğü için size geçici bir nesne verir. swap() parametrelerini başvuruyla aldığından, bu geçici değerlere bağlanamazlar. a ve b numaralarını ilk kez artırdığımız ve daha sonra değiştirilemediği için ++a ve ++b kullanarak çalışın.

1

fonksiyonu std::swap bir lvalue referans aka iki değişkenin değeri takas gerekir. x++ ifadesi bir değişken değil, bir değer veya bir değerdir. Bir değer, bir değer referansına bağlı olamaz.

bir rvalue ve lvalue arasındaki fark bu şekilde açıklanabilir:

int p; 
/* p is left value, 3 is right value, ok */ 
p = 3; 

Ama şu geçerli değil:

/* not ok, 3 is right value */ 
3 = p; 

Ne std::swap gönderiyoruz iki sayı değeri vardır .