Przejdź przez referencję, stałą referencję, referencję rvalue lub stałą referencję rvalue?

Uczyłem się przechodząc przez odniesienie i oto test, który zrobiłem:

#include <iostream>

using namespace std;

int i = 0;

//If this is uncommented, compiler gives ambiguous definition error.
//void paramCheck (string s) {
//  cout << ++i << ". Param is var.\n";
//}

void paramCheck (const string& s) {
    cout << ++i << ". Param is const ref.\n";
}

void paramCheck (string& s) {
    cout << ++i  << ". Param is non-const ref.\n";
}

void paramCheck (const string&& s) {
    cout << ++i  << ". Param is const rvalue-reference.\n";
}

void paramCheck (string&& s) {
    cout << ++i  << ". Param is non-const rvalue-reference.\n";
}


int main(int argc, char **argv) {
    //Function call test
    paramCheck("");

    paramCheck(string{""});

    string s3{""};
    paramCheck(s3);

    const string s4{""};
    paramCheck(s4);

    //Illegal
    //string& s{""};
    //paramCheck(s);

    const string& s5{s3};
    paramCheck(s5);

    string&& s6{""};
    paramCheck(s6);

    //Illegal
    //const string&& s{s1};
    //onstFP(s);

    //Reference test
    string a = s3;
    a = "a changed s3";
    cout << s3;

    {
    string& b = s3;
    b = "b changed after assigning s3\n";
    cout << "s3 is now " <<s3;

    b = s4;
    b = "b changed after assigning s4\n";
    cout << "s3 is now " <<s3;
    cout << "s4 is now " <<s4;
    }

    cin.get();
    return 0;
}

A oto rezultat, który otrzymuję:

1. Param is non-const rvalue-reference.
2. Param is non-const rvalue-reference.
3. Param is non-const ref.
4. Param is const ref.
5. Param is const ref.
6. Param is non-const ref.
s3 is now b changed after assigning s3
s3 is now b changed after assigning s4
s4 is now

Moje pytanie brzmi:

Jeśli przekazujemy ciągłe wyrażenie, to zawsze wyzwala niezmienną referencję rvalue? W jakich warunkach wywoła stałą referencję rvalue (i dlaczego s6 jej nie wyzwala?)

Dlaczego niestałe odniesienie i stałe odniesienie do rvalue są nielegalne?

Spodziewałem się, że a nie może zmienić s3, ale dlaczego b w wewnętrznym zakresie może zmienić s3? Jeśli przypisanie nowego obiektu s3 do b przypisuje nowe odniesienie, dlaczego kiedy przypiszę mu s4 i zmieniono s3, a potem s4 jest puste?

Przepraszam za zadawanie zbyt wielu pytań ... Zwiększę liczbę punktów, gdy wszystkie pytania zostaną udzielone :) Odniesienie po prostu wprowadza moje zamieszanie ze wskaźnika na zupełnie nowy poziom.

Nie wiem, jak zwiększyć punkt ... więc zaczeka 2 dni, aż kwalifikuje się do nagrody, a następnie wybierz odpowiedź.

questionAnswers(5)

yourAnswerToTheQuestion