auto和decltype的区别

张开发
2026/4/18 18:08:14 15 分钟阅读

分享文章

auto和decltype的区别
auto 让编译器推导变量类型基本用法auto 让编译器根据**初始化表达式**自动推导变量类型。auto x 5; // x 被推导为 int auto y 3.14; // y 被推导为 double auto name hello; // name 被推导为 const char* std::vectorint vec {1, 2, 3}; auto it vec.begin(); // it 被推导为 std::vectorint::iteratorauto 的推导规则auto 遵循**模板参数推导规则**const int a 42; auto b a; // b 是 int (const 和 被丢弃) auto c a; // c 是 const int (引用和 const 保留) int arr[10] {}; auto arr1 arr; // arr1 是 int* (数组退化为指针) auto arr2 arr; // arr2 是 int()[10] (数组引用) const char* const str hello; auto s1 str; // s1 是 const char* (顶层const被丢弃)auto在函数返回值中 (C14)C14 允许函数返回值使用 auto 推导auto add(int a, int b) { return a b; // 返回类型推导为 int } auto getVector() { return std::vectorint{1, 2, 3}; // 返回类型推导为 std::vectorint }auto 在 lambda 表达式中C14: lambda 参数可以使用 autoauto lambda [](auto x, auto y) { return x y; }; std::cout lambda(1, 2.5); // 3.5decltype的推导规则decltype有明确的规则1. 如果表达式是**变量名** → 返回该变量的声明类型包括 const 和引用2. 如果表达式是**左值** → 返回 T3. 如果表达式是**将亡值** → 返回 T4. 如果表达式是**纯右值** → 返回 Tint x 0; const int cx 1; int rx x; decltype(x) a; // 规则1: int decltype(cx) b 2; // 规则1: const int decltype(rx) c x; // 规则1: int decltype(x 0) d; // 规则4: int (x0是右值) decltype((x)) e x;// 规则2: int ((x)是左值表达式) decltype(std::move(x)) f 0; // 规则3: intauto vs decltype的关键区别推导方式的区别const int x 42; const int rx x; // auto: 丢弃 const 和引用 (除非显式指定) auto a1 x; // int auto a2 rx; // int // decltype: 保留完整类型信息 decltype(x) b1; // const int (错误需要初始化) decltype(rx) b2; // const int (错误需要初始化) // auto 可以通过 和 const 来保留信息 auto a3 rx; // const int const auto a4 x; // const int在返回值类型推导中的协同使用 (C14)// decltype(auto) - 用 decltype 的规则推导 autoint x 10; const int getRef() { return x; } auto a getRef(); // a 是 int (值类型) decltype(auto) b getRef(); // b 是 const int (保持原样)在函数模板中特别有用templatetypename T1, typename T2 auto add(T1 a, T2 b) - decltype(a b) { // 尾置返回类型 return a b; }

更多文章