首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 函數模板參數傳遞:何時用 const 引用,何時用值傳遞?

     編輯:程式設計綜合問答

核心問題

在編寫 C++ 函數模板時,開發者常面臨一個選擇:形參應該用 const T& 還是直接用 T?這不僅關乎效能,更關乎正確性。

經典反例:迭代器模板

考慮以下打印範圍的模板函數:

template <typename Iterator>
void printl(Iterator v1, Iterator v2) // 正確:值傳遞
{
    while (v1 != v2) {
        cout << *v1++ << endl;
    }
}

若改為 const 引用:

template <typename Iterator>
void printl(const Iterator &v1, const Iterator &v2) // 錯誤:const 引用
{
    while (v1 != v2) {
        cout << *v1++ << endl; // 編譯錯誤!
    }
}

為什麼會出錯?

關鍵在於 *v1++ 這行代碼。後置遞增運算符 ++ 會修改迭代器本身(使其指向下一個元素)。當形參聲明為 const Iterator& 時,編譯器禁止對其進行任何修改操作,因此報錯。

決策指南

  • 值傳遞(推薦用於迭代器、函數對象、小型對象):當函數內部需要修改參數副本,或參數類型輕量(如指針、整數、迭代器)時。
  • const 引用(推薦用於大型對象、不可複製類型):當參數開銷大(如 std::string、std::vector、自定義類)且函數不修改它時。
  • 通用引用(C++11 以降):T&& 配合 std::forward 可同時支援左值與右值,實現完美轉發。

最佳實踐

對於標準庫風格的迭代器算法,值傳遞是標準做法。迭代器設計輕量、可拷貝、語義類似指針,傳值零開銷且避免 const 限制。唯有當模板可能實例化為「不可拷貝但可移動」的類型時,才需考慮引用語義。

記住:const 是契約,違約即編譯失敗。先問「函數內會改這個參數嗎?」,再決定傳遞方式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved