l-değerleri std :: make_pair'e nasıl geçirilebilir

Aug 16 2020

İçinde std::make_pair sadece bir C ++ 14 uygulaması var

şablon <sınıf T1, sınıf T2> constexpr std :: pair <V1, V2> make_pair (T1 && t, T2 && u);

Her iki parametre de R-değeri referansları ve uygun bu

R-değerleri referansları, l-değerleriyle başlatılamaz.

    int i = 1;
    char ch = 'a';
    std::unordered_map<int, char> mp;
    mp.insert(make_pair<int,char>(i, ch));

Bu yüzden yukarıdaki kodda olduğu gibi make_pair'i kullanmaya çalıştığımda doğru bir şekilde bir hata atıyor error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'.

Ancak, şablon bağımsız değişkenlerini değiştirirsem ve olarak adlandırırsam yukarıdaki kod için mükemmel çalışır.

mp.insert(make_pair(i, ch));

Bunun nasıl çalıştığını ive chher ikisinin de L değerleri olduğunu kafam karıştı . Şablon argüman çözünürlüğü L-değerlerini R-değerlerine dönüştürür mü veya bu nasıl çalışır?

Yanıtlar

3 songyuanyao Aug 16 2020 at 08:06

Parametreleri make_pairrvalue referansı olarak değil, yönlendirme referansı olarak bildirilir .

Yönlendirme referansları, bir fonksiyon argümanının değer kategorisini koruyan ve bunu std :: forward aracılığıyla iletmeyi mümkün kılan özel bir referans türüdür. Yönlendirme referansları:

  1. aynı işlev şablonunun cv-nitelenmemiş tür şablon parametresine rvalue başvurusu olarak bildirilen bir işlev şablonunun işlev parametresi:

Yönlendirme başvurusu, şablon bağımsız değişken çıkarımı yardımıyla hem ldeğerlerle hem de r değerleriyle çalışır . Bir ldeğer geçirildiğinde, şablon parametresi lvalue-referansı olarak çıkarılır, referans daraltıldıktan sonra, fonksiyon parametresi de lvalue-referansıdır. Bir rdeğer geçirilirken, şablon parametresi referans olmayan olarak çıkarılır, işlev parametresi rvalue referansıdır.

Öte yandan, şablon bağımsız değişkenini açıkça belirtirseniz make_pair<int,char>(...), işlev parametresi de buna göre rvalue-reference olur.

1 JaMiT Aug 16 2020 at 11:01

Songyuanyao tarafından cevap zaten ne olup bittiğini çoğu açıklıyor. Yine de, açık şablon argümanları ile bunun nasıl çalışacağına katkıda bulunmak isterim. En çok oradaydın, ama son adımı atmadın.

Bunun nasıl çalıştığını ive chher ikisinin de L değerleri olduğunu kafam karıştı .

Kesinlikle. Şablon bağımsız değişkenlerinde belirtebileceğiniz bir şey olan l değerlerini istiyorsunuz:

std::make_pair<int &, char &>(i, ch)

veya daha fazla durumda çalışan bir form:

std::make_pair<const int &, const char &>(i, ch)

Biraz fazladan yazma, ancak herhangi bir nedenle argüman kesintisi başarısız olursa gereklidir.