forward
Prerequisites:
參數為左值與右值
呼叫的函式的參數為左值與右值,相同的函式名,但參數多載(overload)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <functional>
using namespace std;
//參數左值
void func(int& x) {
cout << "l-value" << endl;
}
//參數右值
void func(int&& x) {
cout << "r-value" << endl;
}
int main() {
int i = 10;
//呼叫函式,參數為左值
func(i);
//呼叫函式,參數為右值
func(100);
return 0;
}
l-value
r-value
保留右值參考的屬性
以下的函式,多出了middle()的函式,目的是再一次傳送參數,執行的結果會導致全被視作左值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <functional>
using namespace std;
//參數左值
void func(int& x) {
cout << "l-value" << endl;
}
//參數右值
void func(int&& x) {
cout << "r-value" << endl;
}
void middle(int x) {
func(x);
}
int main() {
int i = 10;
//呼叫函式,參數為左值
middle(i);
//呼叫函式,參數為右值
middle(100);
return 0;
}
l-value
l-value
為了解決以上的問題,需寫一個template,可以接收右值與左值,並把左右值屬性保留住,傳到func()的函式
T&&
若模板的類型為T&&,代表可以接收左值與右值,注意!這邊的T&&不是只能接收右值,也可以不接收左值,跟一般函式參數int&&是不一樣,函式參數類型為int&&就能接收右值。
forward
左右值屬性保留住,傳到其它函式。
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <functional>
using namespace std;
//參數左值
void func(int& x) {
cout << "l-value" << endl;
}
//參數右值
void func(int&& x) {
cout << "r-value" << endl;
}
template<typename T>
void middle(T&& x) {
func(forward<T>(x));
}
int main() {
int i = 10;
//呼叫函式,參數為左值
middle(i);
//呼叫函式,參數為右值
middle(100);
return 0;
}
l-value
r-value