首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 函數模板完美轉發詳解:解決引用與右值保留問題

     編輯:關於C++

轉發問題核心

函數模板呼叫時,實參轉換為形參會發生型別退化:引用變值、右值變左值,導致原始實參資訊遺失,即「完美轉發」問題。

兩大核心問題

  1. 引用保留:模板參數非引用時發生複製,無法保留引用語意
  2. 右值保留:模板參數只能綁定左值,無法區分左值/右值

解決方案:萬用引用 + std::forward

#include <utility>  // std::forward

// 萬用引用參數:T&& 可綁定左值或右值
template <typename T>
void wrapper(T&& arg) {
    // 完美轉發:保留原始值類別
    process(std::forward<T>(arg));
}

// 重載版本區分左值/右值
void process(int& x) { std::cout << "lvalue: " << x << std::endl; }
void process(int&& x) { std::cout << "rvalue: " << x << std::endl; }

std::forward 機制

  • std::forward<T>(arg):若 T 推導為左值引用(U&),回傳左值;若為非引用(U),回傳右值
  • 配合萬用引用 T&& 實現引用摺疊規則:& + & = &, & + && = &, && + & = &, && + && = &&
  • 必須在模板參數列表中使用相同的 T 傳給 forward

實際應用場景

// 工廠函數完美轉發建構參數
template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

// 使用
auto p1 = make_unique<std::string>("hello");           // 右值
std::string s = "world";
auto p2 = make_unique<std::string>(s);                // 左值
auto p3 = make_unique<std::string>(std::move(s));     // 右值轉換

關鍵口訣

「萬用引用配合 forward,左值右值全保留」 — 這是現代 C++ 泛型程式設計的核心技巧。

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