Я изучал передачу по ссылке, и вот тест, который я сделал:
#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;
}
И вот результат:
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
Мой вопрос:
-  Если мы передаем константное выражение, оно всегда вызывает непостоянный rvalue-reference? При каких условиях он будет запускать постоянную rvalue-reference (и почему s6 не запускает ее?) 
-  Почему не постоянная ссылка и постоянная ссылка rvalue являются незаконными? 
-  Я ожидал, что нельзя изменить s3, но почему b во внутренней области может изменить s3? Если присваивание нового объекта s3 в b назначает новую ссылку, почему, когда я назначаю s4 ему и s3 получил изменен, а s4 пуст после? 
Извините, что задал слишком много вопросов... Я увеличиваю очки, когда будут отвечать все вопросы:) Ссылка просто приносит мою путаницу из указателя на совершенно новый уровень.
Я не знаю, как увеличить точку... так что подождите 2 дня, пока не получится получить награду, а затем выберите ответ.
