cplusplus的完美转发

  1. 在 C++ 中, 完美转发(perfect forwarding) 用来在函数模板中保持参数的原始类型特性(左值/右值, const/非 const、引用等), 并将它们原封不动地传递给另一个函数.

cplusplus 的左值和右值[^1]

为什么需要完美转发?

  1. 在模板函数中, 如果你写一个包装函数来调用另一个函数, 参数的值类别(左值/右值)可能会丢失.

代码示例

没有使用完美转发
使用完美转发
#include <iostream>
#include <string>

void process(const std::string& s) {
    std::cout << "左值引用: " << s << "\n";
}

void process(std::string&& s) {
    std::cout << "右值引用: " << s << "\n";
}

template <typename T>
void wrapper(T arg) {
    // 注意:这里 arg 是一个有名字的变量,即使传入右值,也会变成左值
    process(arg);
}

int main() {
    std::string str = "Hello";
    wrapper(str);                  // 左值调用
    wrapper(std::string("World")); // 本来是右值,但丢失了右值特性
}
#include <iostream>
#include <string>
#include <utility>

void process(const std::string& s) {
    std::cout << "左值引用: " << s << "\n";
}

void process(std::string&& s) {
    std::cout << "右值引用: " << s << "\n";
}

template <typename T>
void wrapper(T&& arg) {
    // 使用 std::forward 保留原始值类别
    process(std::forward<T>(arg));
}

int main() {
    std::string str = "Hello";
    wrapper(str);                  // 左值调用
    wrapper(std::string("World")); // 保留右值特性
}

参考链接

[^1]Valuecategorieshttps://en.cppreference.com/w/cpp/language/value_category.html. [^2]forwardhttps://en.cppreference.com/w/cpp/utility/forward.html