首先就是关于引用折叠引用折叠 是C模板元编程和类型推导中的一种规则用于处理多重引用如T 或T 的组合情况。其核心目的是简化模板中对引用类型的推导确保最终生成的引用类型符合语言规范。在C中引用折叠遵循以下四条规则T 折叠为TT 折叠为TT 折叠为TT 折叠为T说的通俗一点就是只要两个引用中有左值引用最后的结果就是左值引用只有两个都是右值引用最终的结果才会是右值引用。由此我们可以得到一个万能引用Function(T t)函数模板程序中传左值实例化以后是左值引⽤的Function函数传右值实例化 以后是右值引⽤的Function函数。而通过万能引用我们可以得到C1一种新的特性移动语义移动语义是C11引入的重要特性旨在高效转移资源所有权而非复制数据。通过右值引用和移动构造函数/赋值运算符实现减少不必要的深拷贝提升性能。#include iostream #include vector class MyObject { public: // 默认构造函数 MyObject() { std::cout Default Constructor\n; } // 移动构造函数 MyObject(MyObject other) noexcept { std::cout Move Constructor\n; } }; int main() { MyObject obj1; MyObject obj2 std::move(obj1); // 触发移动构造函数 return 0; }移动构造的本质是在构造一个有空间的对象时在函数中会产生临时对象而临时对象的资源可以直接跟我们想要的对象的资源交换而临时对象在生命周期结束时编译器会自动销毁这将提升我们的效率在之前的章节中我们提到过右值引用之后的对象会被视为左值如果我们碰到需要深拷贝的对象比如我们在vector中加入的是我们自己创建的一个类我们暂且叫他qwvector在创建对象时也会自动调用qw的构造但是如果我们用的是右值引用但是传到qw这里会变成左值我们希望右值的属性传递下去这时候怎么办呢C11提出了一种新的定义完美转发允许函数模板将其参数以原始类型和值类别左值/右值转发给另一个函数。#include iostream #include utility void process(int x) { std::cout 左值: x std::endl; } void process(int x) { std::cout 右值: x std::endl; } template typename T void forwarder(T arg) { process(std::forwardT(arg)); } int main() { int a 10; forwarder(a); // 转发左值 forwarder(20); // 转发右值 return 0; }通过forward函数就可以将对象本来的属性传递下去
C++ 11新特性(2)
发布时间:2026/6/8 6:50:24
首先就是关于引用折叠引用折叠 是C模板元编程和类型推导中的一种规则用于处理多重引用如T 或T 的组合情况。其核心目的是简化模板中对引用类型的推导确保最终生成的引用类型符合语言规范。在C中引用折叠遵循以下四条规则T 折叠为TT 折叠为TT 折叠为TT 折叠为T说的通俗一点就是只要两个引用中有左值引用最后的结果就是左值引用只有两个都是右值引用最终的结果才会是右值引用。由此我们可以得到一个万能引用Function(T t)函数模板程序中传左值实例化以后是左值引⽤的Function函数传右值实例化 以后是右值引⽤的Function函数。而通过万能引用我们可以得到C1一种新的特性移动语义移动语义是C11引入的重要特性旨在高效转移资源所有权而非复制数据。通过右值引用和移动构造函数/赋值运算符实现减少不必要的深拷贝提升性能。#include iostream #include vector class MyObject { public: // 默认构造函数 MyObject() { std::cout Default Constructor\n; } // 移动构造函数 MyObject(MyObject other) noexcept { std::cout Move Constructor\n; } }; int main() { MyObject obj1; MyObject obj2 std::move(obj1); // 触发移动构造函数 return 0; }移动构造的本质是在构造一个有空间的对象时在函数中会产生临时对象而临时对象的资源可以直接跟我们想要的对象的资源交换而临时对象在生命周期结束时编译器会自动销毁这将提升我们的效率在之前的章节中我们提到过右值引用之后的对象会被视为左值如果我们碰到需要深拷贝的对象比如我们在vector中加入的是我们自己创建的一个类我们暂且叫他qwvector在创建对象时也会自动调用qw的构造但是如果我们用的是右值引用但是传到qw这里会变成左值我们希望右值的属性传递下去这时候怎么办呢C11提出了一种新的定义完美转发允许函数模板将其参数以原始类型和值类别左值/右值转发给另一个函数。#include iostream #include utility void process(int x) { std::cout 左值: x std::endl; } void process(int x) { std::cout 右值: x std::endl; } template typename T void forwarder(T arg) { process(std::forwardT(arg)); } int main() { int a 10; forwarder(a); // 转发左值 forwarder(20); // 转发右值 return 0; }通过forward函数就可以将对象本来的属性传递下去