当前位置: 首页 > news >正文

C++完美转发与引用折叠

C++完美转发与引用折叠

完美转发保持参数的值类别,确保资源所有权正确传递。引用折叠规则决定模板参数推导后的引用类型。这两者是实现通用包装器的关键技术。

引用折叠规则确定最终引用类型。

#include
#include
#include
#include

template
void show_category(T&& arg) {
if constexpr (std::is_lvalue_reference_v) {
std::cout << "Lvalue reference (T = T&)\n";
} else if constexpr (std::is_rvalue_reference_v) {
std::cout << "Rvalue reference (T = T&&)\n";
} else {
std::cout << "Not a reference\n";
}
}

void reference_folding() {
int x = 42;
std::cout << "Call with lvalue: ";
show_category(x);

std::cout << "Call with rvalue: ";
show_category(100);
}

std::forward保持值类别进行转发。

void process(int& x) {
std::cout << "Lvalue: " << x << "\n";
}

void process(int&& x) {
std::cout << "Rvalue: " << x << "\n";
}

template
void forwarder(T&& arg) {
process(std::forward(arg));
}

void forwarding_demo() {
int x = 10;
std::cout << "Forwarding lvalue: ";
forwarder(x);

std::cout << "Forwarding rvalue: ";
forwarder(20);
}

完美转发在工厂函数中的应用。

template
std::unique_ptr make_unique_fwd(Args&&... args) {
return std::unique_ptr(new T(std::forward(args)...));
}

class Widget {
std::string name_;
int value_;
public:
Widget(const std::string& name, int v)
: name_(name), value_(v) {
std::cout << "Widget(const string&)\n";
}

Widget(std::string&& name, int v)
: name_(std::move(name)), value_(v) {
std::cout << "Widget(string&&)\n";
}

void show() const {
std::cout << name_ << ": " << value_ << "\n";
}
};

void factory_demo() {
std::string s = "test";
auto w1 = make_unique_fwd(s, 42);
w1->show();

auto w2 = make_unique_fwd(std::string("temp"), 100);
w2->show();
}

可变参数模板与完美转发结合。

template
void print_all(Args&&... args) {
(std::cout << ... << std::forward(args)) << "\n";
}

void variadic_forward() {
print_all("Hello", " ", "World", " ", 42, " ", 3.14);
}

完美转发包装器。

template
decltype(auto) call_wrapper(Func&& func, Args&&... args) {
std::cout << "Before call\n";
if constexpr (std::is_void_v(args)...))>) {
func(std::forward(args)...);
std::cout << "After call (void)\n";
} else {
auto result = func(std::forward(args)...);
std::cout << "After call (non-void)\n";
return result;
}
}

int add(int a, int b) {
return a + b;
}

void say_hello(const std::string& name) {
std::cout << "Hello, " << name << "!\n";
}

void wrapper_demo() {
int result = call_wrapper(add, 10, 20);
std::cout << "Result: " << result << "\n";

call_wrapper(say_hello, "Alice");
}

引用折叠的四种情况。

template
void fold_examples() {
using lref = T&;
using rref = T&&;

using T1 = lref&;
using T2 = lref&&;
using T3 = rref&;
using T4 = rref&&;

std::cout << "T& & -> T&: " << std::is_same_v << "\n";
std::cout << "T& && -> T&: " << std::is_same_v << "\n";
std::cout << "T&& & -> T&: " << std::is_same_v << "\n";
std::cout << "T&& && -> T&&: " << std::is_same_v << "\n";
}

void folding_rules() {
fold_examples();
}

完美转发在emplace_back中的应用。

class Expensive {
std::string data_;
public:
Expensive(const std::string& d) : data_(d) {
std::cout << "Copy string\n";
}
Expensive(std::string&& d) : data_(std::move(d)) {
std::cout << "Move string\n";
}
};

void emplace_demo() {
std::vector vec;
std::string s = "Hello";

std::cout << "push_back with copy:\n";
vec.push_back(Expensive(s));

std::cout << "emplace_back with move:\n";
vec.emplace_back(std::move(s));
}

转发引用与auto&&。

void auto_forward() {
auto&& forwarded = []() -> int { return 42; }();
std::cout << "Forwarded: " << forwarded << "\n";
}

完美转发是现代C++泛型库开发的基础技术。

http://www.gsyq.cn/news/1556525.html

相关文章:

  • 武汉配眼镜多少钱?六个常见问题一次说清楚 - 配眼镜新资讯
  • 2026虎门高口碑法律顾问律所推荐(知识产权+商事纠纷专项) - GrowthUME
  • 郑州配眼镜常见问题速查:价格流程一次性讲清楚 - 配眼镜新资讯
  • 构建企业级文档智能检索系统的5步架构设计实战指南
  • Selenium元素定位全解析:八种策略与实战避坑指南
  • Get cookies.txt LOCALLY终极指南:本地Cookie导出工具完全教程
  • 异构双核MCU架构解析:LPC43S6x如何实现高性能与低功耗的完美平衡
  • 江浙沪超大型仿真大树定制该怎么选?2026仿真大树定制行业选型与落地调研报告 - 三棵树园艺
  • 2026合肥刑事辩护服务市场调研与适配律师推荐指南 - 万事通达
  • AI团队范式:mini与nano协同架构解析
  • 郑州配眼镜怎么避坑?五步选出靠谱好眼镜 - 配眼镜新资讯
  • 深耕龙城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • 数据为中心的AI:从模型优化转向数据治理的工程实践
  • 上海配眼镜实用攻略:三步完成从需求到取镜的决策 - 配眼镜新资讯
  • 2026苏州防水补漏权威指南:卫生间/屋面/外墙/地下室正规施工+透明报价+避坑全攻略 - 苏易修缮
  • CPPM考试科目有哪些?考试内容详解 - 众智商学院课程中心
  • MC68F375 QSMCM模块深度解析:QSPI主从模式与SCI队列通信实战
  • SCMP考试科目有哪些?考试内容全解析 - 众智商学院课程中心
  • Gemma-4B多模态模型:原生统一token空间的轻量推理范式
  • 杭州配眼镜去哪好?三步搞定配镜全决策 - 配眼镜新资讯
  • 洛谷 P1083 [NOIP2012 提高组] 借教室
  • YOLO系列目标检测数据集大全【第三十六期】
  • 大模型自我进化范式:在线蒸馏、动态记忆图谱与梯度感知采样
  • ViGEmBus虚拟游戏控制器驱动:终极安装与使用完全指南
  • MC68HC11A8串行通信:SCI异步与SPI同步接口原理与实战
  • 深耕星城防水领域 匠心守护安居|微顺虹防水:初心筑品质,服务护万家 - 徽顺虹
  • 2026扬州防水补漏维修团队实测盘点TOP4:扬州业主房屋渗漏修缮靠谱选择 - 宅安选房屋修缮
  • 昆明配眼镜去哪好?按镜片功能选店更靠谱 - 配眼镜新资讯
  • 基于SQLMap与爬虫构建自动化SQL注入检测系统
  • 变压器核心原理与应用解析:从电磁感应到等效电路