[英]Template arguments in C++
我正在閱讀模板基礎知識以及如何使用模板將參數傳遞給函數。 下面的程序我試過,運行正常,沒有任何編譯錯誤。 該函數正在修改傳遞給它的值,但rx
和cx
是常量,不能修改它們。 因此,編譯器應該拋出編譯錯誤。
輸出來了:
Param before : 27
Param after : 23
Param before : 27
Param after : 23
Param before : 27
Param after : 23
以下是完整的代碼:
#include <iostream>
using namespace std;
template<typename T>
//void f(const T& param) // param is now a ref-to-const
void f(T param)
{
cout << "Param before : " << param << endl;
param = 23;
cout << "Param after : " << param << endl;
}
int main(int argc, char *argv[])
{
int x = 27;
const int cx = x;
const int& rx = x; // as before
// as before
// // as before
f(x); // T is int, param's type is const int&
f(cx); // T is int, param's type is const int&
f(rx); // T is int, param's type is const int&
return 0;
}
當函數參數定義為按值傳遞時,如函數模板f
param
:
template<typename T>
void f(T param) // <-- note T, and not T&
發生類型衰減 ,結果丟棄const
限定符。 這種“取消資格”是有道理的,因為它實際上是傳遞給函數而不是 原始對象的副本 (例如:原始對象可能是const
,但其副本不必)。
該函數正在修改傳遞給它的值,但
rx
和cx
是常量,不能修改它們。
由於上面提到的類型衰減,在你的三種情況下, T
被推斷為int
(即:不合格)。 該函數實際上是修改非const
正在傳遞的對象的副本。 因此,您沒有看到任何編譯錯誤。
f
每次使用都是修改傳遞給它的值的副本 。 這些副本都不是const &
,因此修改它們非常好
使用模板參數中的T
,刪除const
, volatile
和&
。 同樣的規則適用於auto
。 這稱為類型衰減。
所以在每種情況下只使用一個函數void f (int param)
。
f(x); // argument is int, T is int, param's type is int
f(cx); // argument is const int, T is int, param's type is int
f(rx); // argument is const int &, T is int, param's type int
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.