簡體   English   中英

C ++中的模板參數

[英]Template arguments in C++

我正在閱讀模板基礎知識以及如何使用模板將參數傳遞給函數。 下面的程序我試過,運行正常,沒有任何編譯錯誤。 該函數正在修改傳遞給它的值,但rxcx是常量,不能修改它們。 因此,編譯器應該拋出編譯錯誤。

輸出來了:

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 ,但其副本不必)。


該函數正在修改傳遞給它的值,但rxcx是常量,不能修改它們。

由於上面提到的類型衰減,在你的三種情況下, T被推斷為int (即:不合格)。 該函數實際上是修改非const正在傳遞的對象的副本。 因此,您沒有看到任何編譯錯誤。

f每次使用都是修改傳遞給它的值的副本 這些副本都不是const & ,因此修改它們非常好

使用模板參數中的T ,刪除constvolatile& 同樣的規則適用於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM