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