C++ 左值右值、左值引用右值引用、integral_constant、integral_constant的元模板使用案例
- 一、左值右值
- 1.左值
- 2.右值
- 二、左值引用右值引用
- 1.左值引用
- 2.右值引用
- 总结
- 三、integral_constant
- 四、integral_constant的元模板使用案例
- 1.求最大整数
- 2.内存对齐
- alignof关键字
- 元模板计算内存对齐
一、左值右值
1.左值
含义:
- 代表一个有明确、持久内存位置的对象。可以理解为能取地址 (&) 的对象。
特点:
- 有独立的内存地址(可以对其使用取地址运算符 &)。
- 在程序的多个地方可以使用(即“有名字”,或者可以通过指针/引用持久访问)。
- 通常出现在赋值表达式的 左边或右边。
- 生命周期超出其所在的单个表达式。
例子:
int main() {int x = 10; // x是左值 (有地址的存储单元)int arr[5]; // arr是左值int* ptr = &x; // 对左值取地址有效// 错误用法:// &10; // 错误!10是右值(字面量没有地址)
}
2.右值
含义:
- 代表一个临时的、即将消亡的值。通常没有明确的、可由程序通过变量名或指针直接访问的内存地址(或者这种访问没有意义)。可以理解为“只能出现在赋值表达式右边”的值。
特点:
- 通常是 临时对象 或 纯常量值。
- 不能对其使用取地址运算符 &(尝试这样做编译器会报错)。
- 通常用于:
初始化赋值(右边)
函数参数(按值传递或绑定到右值引用)
作为函数返回值(按值返回)
只在该表达式中有效,其值在包含该表达式的语句结束后往往不再需要(将被销毁)。
例子:
int calculate() { return 100; }int main() {int a = 20; int b = a + 5; // (a+5)是右值(临时计算结果)int c = calculate(); // 函数返回值是右值int d = 30; // 30本身是右值// 错误用法:// &(a+b); // 错误!临时结果无地址
}
二、左值引用右值引用
1.左值引用
2.右值引用
实际场景对比
// 传统方式(左值引用)
void process_copy(const std::vector<int>& data) {// 只能读取,无法优化临时数据
}// 现代方式(右值引用重载)
void process_move(std::vector<int>&& data) {// 直接接管临时数据的资源
}int main() {std::vector<int> temp = generateData(); // 生成1GB数据// 传统处理 - 产生额外拷贝process_copy(temp); // ✅ 安全但慢(保留下次使用)// 优化处理 - 避免拷贝process_copy(generateData()); // ❌ 低效:临时数据仍被拷贝process_move(generateData()); // ✅ 高效:直接接管资源// 显式移交所有权process_move(std::move(temp)); // ⚠️ 移交后temp不再可靠
}
注意:非const左值引用不能绑定到右值
总结
左值:有名字、有地址的对象。
右值:临时对象,没有名字。
左值引用(T&):只能绑定左值,用于别名。
右值引用(T&&):只绑定右值,用于移动语义。
std::move:让左值变成右值引用。
std::forward:在泛型编程中保持值类别。
记住核心目的:右值引用和移动语义是为了避免不必要的拷贝,提升性能。
三、integral_constant
定义常量一般使用:枚举、static、const 去定义。integral_constant可以让我们在预编译期定义常量
基础使用方式如下:
typedef std::integral_constant<int, 100>::type TestValue;int a = TestValue::value;
四、integral_constant的元模板使用案例
1.求最大整数
定义:
template<int,int...Args>
struct IntMax;template<int a>
struct IntMax<a> : std::integral_constant<int,a>
{};template<int a1,int a2, int...Args>
struct IntMax<a1, a2, Args...>: std::integral_constant<int, a1 >= a2 ?IntMax<a1, Args...>::value :IntMax<a2, Args...>::value>
{};
使用:
std::cout << IntMax<1, 2, 5, 4, 3>::value << std::endl;
2.内存对齐
alignof关键字
用于内存对齐
struct FStruct{int a;float b;char c;double d;};std::cout << alignof(FStruct) << std::endl; // 结果为8std::cout << sizeof(FStruct) << std::endl; // 结果为24 //int 4 float 4 || char 1 -> 8 || double 8 ==> 3*8 = 24
元模板计算内存对齐
定义:
template<typename...Args>
struct AlignofStuct : std::integral_constant<int,IntMax<std::alignment_of<Args>::value...>::value>
{};
使用:
std::cout << AlignofStuct<int, char, float, double>::value << std::endl;