当前位置: 首页 > 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.jsqmd.com/news/1044615/

相关文章:

  • 2026青岛门窗选购权威指南:五大技术派源头工厂深度实测与年度严选榜单 - GrowthUME
  • 深入解析MCU时钟系统:从FLL原理到S08 ICG实战配置
  • SoapUI实战指南:从零构建企业级API自动化测试框架
  • 全省升本优势院校,合肥腾飞学校打造中职生本科升学通道 - 辛云教育资讯
  • 2026虎门高口碑法律顾问律所推荐(知识产权+商事纠纷专项) - GrowthUME
  • 珠海同城购宠全攻略:拒绝套路,南屏工业园靠谱猫犬舍地址+选宠干货 - 萌宠俱乐部
  • 郑州配眼镜常见问题速查:价格流程一次性讲清楚 - 配眼镜新资讯
  • Selenium元素定位全解析:八种策略与实战避坑指南
  • 终极Markdown Viewer浏览器插件完整指南:让技术文档阅读变得简单高效
  • 深圳配眼镜去哪好?验光专业度是核心考量 - 配眼镜新资讯
  • 构建企业级文档智能检索系统的5步架构设计实战指南
  • 绝区零一条龙:让游戏回归乐趣的智能伴侣
  • SAS ODS RTF进阶:巧用转义与编码输出复杂科学符号
  • Get cookies.txt LOCALLY终极指南:本地Cookie导出工具完全教程
  • 2026无锡防水补漏权威指南:卫生间/屋面/外墙/地下室正规施工+透明报价+避坑全攻略 - 苏易修缮
  • 2026烟台防水补漏维修团队实测盘点TOP4:烟台业主房屋渗漏修缮靠谱选择 - 宅安选房屋修缮
  • 异构双核MCU架构解析:LPC43S6x如何实现高性能与低功耗的完美平衡
  • 连云港GEO服务商代理加盟选型靠谱推荐哪家强?2026年连云港GEO优化服务商代理加盟排名与合作权益深度解析 - 小随科技
  • 企业级BS社区物业管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 寮步镇Shopee选品培训:东南亚热销品深度分析 - 东莞选校指南
  • 上海配眼镜适合什么人?四类典型人群的镜片适配方案 - 配眼镜新资讯
  • 2026年6月母线槽厂家推荐,高压型母线槽/封闭型母线槽/铝合金外壳母线槽/防火浇筑型母线槽,母线槽安装门店哪家好 - 品牌推荐师
  • Linux QT开发:从零构建MQTT客户端应用
  • 江浙沪超大型仿真大树定制该怎么选?2026仿真大树定制行业选型与落地调研报告 - 三棵树园艺
  • AI团队范式:mini与nano协同架构解析
  • 2026合肥刑事辩护服务市场调研与适配律师推荐指南 - 万事通达
  • 跨省寄快递省钱攻略 2026各家物流价格对比与技巧 - 快递物流资讯
  • 郑州配眼镜怎么避坑?五步选出靠谱好眼镜 - 配眼镜新资讯
  • 桌面共用NAS防止误删误格式化操作的磁盘保护解决办法
  • OpenPLC Editor终极指南:免费开源PLC编程工具快速入门