引用折叠规则规定T&或T&&组合时,只要存在左值引用则结果为左值引用,否则为右值引用;万能引用是模板中可推导的T&&类型,能根据实参推导为左值或右值引用,并与std::forward配合实现完美转发,仅在模板参数且类型被推导时成立。

在C++中,引用折叠和万能引用(也叫转发引用)是模板和类型推导中的重要机制,尤其在实现完美转发时非常关键。理解它们有助于写出更高效的泛型代码。
引用折叠规则
引用折叠是一种在模板实例化或类型推导过程中,多个引用符号合并成一个引用的规则。C++规定了四种引用折叠情况:
T& & 折叠为 T& T& && 折叠为 T& T&& && 折叠为 T&& T&& & 折叠为 T&
简单记法:只要出现左值引用,结果就是左值引用;只有全是右值引用时,结果才是右值引用。
万能引用(Universal Reference)
“万能引用”这个术语由Scott Meyers提出,实际上指的是形式为 T&& 的模板参数,其中T是模板类型参数。它之所以“万能”,是因为它可以根据初始化表达式的值类型推导为左值引用或右值引用。
立即学习“C++免费学习笔记(深入)”;
关键条件是:
必须是模板参数 T&& 类型T必须被推导(不能显式指定)
例如:
template
void func(T&& param) {
// param 是万能引用
}
调用时:
func(obj); // obj是左值 → T 推导为 Type&,param 类型是 Type& func(std::move(obj)); // 右值 → T 推导为 Type,param 类型是 Type&&
与std::forward配合实现完美转发
万能引用常用于保存参数,再通过 std::forward 保持其原始值类别进行转发。
示例:
template
void wrapper(T&& arg) {
target(std::forward(arg));
}
这里:
如果传入左值,T 推导为 T&,std::forward 返回左值引用 如果传入右值,T 推导为 T,std::forward 返回右值引用
这样就能实现“该拷贝的拷贝,该移动的移动”,即完美转发。
常见误区
不是所有 T&& 都是万能引用。例如:
void func(MyClass&& param); // 这是右值引用,不是万能引用
template
void func(std::vector&& vec); // 参数类型不是 T&&,而是 vector&&,不涉及类型推导,不是万能引用
只有在模板中且类型被推导的 T&& 才是万能引用。
基本上就这些。掌握引用折叠和万能引用,能让你更好地理解 move、forward 和模板参数传递的行为。不复杂但容易忽略细节。
以上就是C++如何在语法中使用引用折叠和万能引用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1475288.html
微信扫一扫
支付宝扫一扫