私は参照渡しを学んでいましたが、これが私が行ったテストです:
#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
私の質問は:
定数式を渡すと、常に非定数右辺値参照がトリガーされますか? どのような条件下で、定数の右辺値参照がトリガーされますか (そして、なぜ s6 はそれをトリガーしないのですか?)
非定数参照と定数右辺値参照が違法なのはなぜですか?
a は s3 を変更できないと思っていましたが、なぜ内部スコープの b が s3 を変更できるのでしょうか? 新しいオブジェクト s3 を b に割り当てることが新しい参照を割り当てる場合、s4 をそれに割り当てると、s3 が変更され、その後 s4 が空になるのはなぜですか?
質問が多すぎてすみません... すべての質問に答えたらポイントを増やします:) 参照は、ポインタからまったく新しいレベルへの私の混乱をもたらします.
ポイントの増やし方がわからないので…バウンティ対象になるまで2日待ってから回答を選択します。