我是學引用傳遞,這裏是測試我所做的:通過引用,常量引用,右值引用或常量右值引用傳遞?
#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?如果給b分配一個新的對象s3是分配一個新的引用,爲什麼當我將s4賦值給s3並且s3被更改並且s4之後是空的?
對不起,問太多的問題......我會增加點時,所有的問題都回答:)參考只是帶來了指針我的困惑到一個全新的水平。
我不知道如何增加點...所以將等待2天,直到有資格獲得賞金,然後選擇答案。
在C++中沒有引用引用*。 '&&'語法是指右值引用或通用引用(在模板中)。 – dyp
通過引用您引用的意思是右值引用。該標準特別呼籲引用引用是不允許的。只是FYI。 C++ 11§8.3.2,p5:*「應該沒有對引用的引用,沒有引用數組,並且沒有指向引用的指針......」*簡寫爲..以及簡潔。 – WhozCraig
好,我糾正了它們。 – texasbruce