2.2 KiB
2.2 KiB
好,那我就帮你系统性地整理一份 C++ 中 auto
与 lambda 函数的知识大全,把语法细节、坑点、进阶用法都讲全,让你能用到开发级别。
我会先分两部分:
auto
关键字大全- Lambda 函数大全 最后会给出它们的 联合应用技巧。
1. auto
关键字大全
1.1 基础概念
-
作用:让编译器自动推导变量、函数返回值、模板参数的类型。
-
推导时间:编译期完成(不影响运行时性能)。
-
核心限制:
- 必须有初始化值(除非是函数返回类型或形参声明中)。
- 不能推导为 数组类型(会退化为指针)和 函数类型(会退化为函数指针)。
1.2 基本用法
auto x = 10; // int
auto y = 3.14; // double
auto ptr = &x; // int*
auto str = "Hello"; // const char*
1.3 auto
推导规则
假设初始化表达式类型为 T
:
-
普通变量:直接推导为
T
。 -
有引用:
int a = 5; int& r = a; auto x = r; // int(引用被忽略)
-
有 const:
const int a = 5; auto x = a; // int(顶层 const 被忽略)
-
保留引用和 const:需要
auto&
/const auto&
const int a = 5; auto& r = a; // const int& const auto& cr = a; // const int&
1.4 特殊形式
-
auto*
:明确推导为指针类型 -
decltype(auto)
:保留完整类型信息(包括引用、const)int x = 1; int& r = x; auto a = r; // int decltype(auto) b = r; // int&
1.5 在函数中
-
返回类型推导
auto add(int a, int b) { return a + b; } // 返回 int
-
尾返回类型
template<class T, class U> auto add(T a, U b) -> decltype(a+b) { return a+b; }
1.6 常见坑
-
不同返回类型不能推导:
auto test(bool b) { if (b) return 1; // int else return 1.5; // double } // ❌ 编译错误
-
列表初始化可能推导成
std::initializer_list
:auto x = {1, 2, 3}; // std::initializer_list<int>