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

results matching ""

    No results matching ""