当前位置: 首页 > news >正文

C++类型推导与auto关键字

C++类型推导与auto关键字

类型推导是C++11引入的重要特性,通过auto和decltype关键字,编译器可以自动推导变量的类型,减少代码冗余并提高可维护性。

auto关键字让编译器根据初始化表达式推导变量类型。

#include
#include
#include
#include

void basic_auto_usage() {
auto x = 42;
auto y = 3.14;
auto z = "hello";

std::cout << "x type: int, value: " << x << "\n";
std::cout << "y type: double, value: " << y << "\n";
std::cout << "z type: const char*, value: " << z << "\n";

auto vec = std::vector{1, 2, 3, 4, 5};
std::cout << "Vector size: " << vec.size() << "\n";
}

auto在迭代器使用中特别有用,避免了冗长的类型声明。

void auto_with_iterators() {
std::map scores = {
{"Alice", 95},
{"Bob", 87},
{"Charlie", 92}
};

for (auto it = scores.begin(); it != scores.end(); ++it) {
std::cout << it->first << ": " << it->second << "\n";
}

for (const auto& pair : scores) {
std::cout << pair.first << ": " << pair.second << "\n";
}
}

auto推导时会去除引用和const限定符,需要显式添加。

void auto_qualifiers() {
int x = 42;
const int& ref = x;

auto a = ref;
auto& b = ref;
const auto& c = ref;

a = 100;
std::cout << "x after modifying a: " << x << "\n";

std::cout << "Type of a: int (copy)\n";
std::cout << "Type of b: const int& (reference)\n";
std::cout << "Type of c: const int& (const reference)\n";
}

decltype用于查询表达式的类型,不会对表达式求值。

void decltype_basic() {
int x = 42;
decltype(x) y = 100;

std::cout << "y: " << y << "\n";

const int& ref = x;
decltype(ref) z = x;

std::cout << "Type of z preserves const and reference\n";
}

decltype(auto)结合了auto和decltype的特性,保留表达式的完整类型信息。

template
decltype(auto) access(Container& c, Index i) {
return c[i];
}

void decltype_auto_example() {
std::vector vec = {1, 2, 3, 4, 5};

decltype(auto) value = access(vec, 2);
value = 100;

std::cout << "Modified vector[2]: " << vec[2] << "\n";
}

auto可以用于函数返回类型推导。

auto add(int a, int b) {
return a + b;
}

auto multiply(double a, double b) -> decltype(a * b) {
return a * b;
}

template
auto generic_add(T a, U b) -> decltype(a + b) {
return a + b;
}

void auto_return_type() {
std::cout << "add(3, 4): " << add(3, 4) << "\n";
std::cout << "multiply(2.5, 3.0): " << multiply(2.5, 3.0) << "\n";
std::cout << "generic_add(10, 3.5): " << generic_add(10, 3.5) << "\n";
}

auto在lambda表达式中简化了类型声明。

void auto_with_lambda() {
auto lambda = [](int x, int y) {
return x + y;
};

std::cout << "Lambda result: " << lambda(10, 20) << "\n";

auto generic_lambda = [](auto a, auto b) {
return a + b;
};

std::cout << "Generic lambda (int): " << generic_lambda(5, 10) << "\n";
std::cout << "Generic lambda (double): " << generic_lambda(2.5, 3.5) << "\n";
}

结构化绑定使用auto解包复合类型。

#include

std::tuple get_data() {
return {42, 3.14, "hello"};
}

void structured_bindings() {
auto [x, y, z] = get_data();
std::cout << "x: " << x << ", y: " << y << ", z: " << z << "\n";

std::map scores = {{"Alice", 95}, {"Bob", 87}};

for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << "\n";
}

std::pair p = {1, "one"};
auto& [id, text] = p;
id = 2;
std::cout << "Modified pair: " << p.first << ", " << p.second << "\n";
}

auto可以用于模板参数推导。

template
struct Constant {
static constexpr auto value = Value;
};

void template_auto() {
Constant<42> int_const;
Constant<3.14> double_const;

std::cout << "Int constant: " << int_const.value << "\n";
std::cout << "Double constant: " << double_const.value << "\n";
}

类型推导在复杂表达式中特别有用。

void complex_type_deduction() {
std::vector>> complex_data;

complex_data.push_back({
{"numbers", {1, 2, 3}},
{"more", {4, 5, 6}}
});

for (const auto& map : complex_data) {
for (const auto& [key, vec] : map) {
std::cout << key << ": ";
for (auto val : vec) {
std::cout << val << " ";
}
std::cout << "\n";
}
}
}

auto不能用于函数参数,但可以用于泛型lambda。

void auto_limitations() {
auto lambda = [](auto x) {
return x * 2;
};

std::cout << "Lambda with int: " << lambda(21) << "\n";
std::cout << "Lambda with double: " << lambda(3.14) << "\n";
}

类型推导与完美转发结合使用。

template
auto forward_wrapper(T&& arg) {
return std::forward(arg);
}

void type_deduction_forwarding() {
int x = 42;
auto result1 = forward_wrapper(x);
auto result2 = forward_wrapper(100);

std::cout << "Forwarded lvalue: " << result1 << "\n";
std::cout << "Forwarded rvalue: " << result2 << "\n";
}

类型推导是现代C++的重要特性,它使代码更简洁、更易维护,同时保持类型安全。

http://www.jsqmd.com/news/865415/

相关文章:

  • 天津婚姻家事纠纷解决专家:家理律所专业律师团队精心服务 - 外贸老黄
  • 浏览器插件消息通信:异步机制与数据获取避坑(ps:发送方收到的返回值是 undefined)
  • 【仅剩最后200份】DeepSeek内部《云原生AI平台SLA白皮书》精要版:含12项SLO指标定义、告警阈值公式与根因定位树
  • 2026 年西安建筑资质代办最新排名,本地企业首选推荐 - COINUP
  • 3秒免费获取百度网盘提取码:baidupankey智能工具终极指南
  • CyberChef:在浏览器中解决复杂数据处理难题的瑞士军刀
  • 面试中被嘲笑Token放在Redis里?这把给我干沉默了...
  • 北航毕业论文LaTeX模板:3天掌握专业排版,告别格式焦虑
  • SolidWorks自学day1-自留
  • 通过模型广场的直观对比与快速切换找到最适合当前任务的模型
  • 信创操作系统深度对比:统信UOS vs 麒麟OS vs openEuler,企业级选型指南
  • 广州婚纱照推荐|深耕品质美学,解锁多元婚拍新体验 - 品牌评测官
  • ARMv8/v9虚拟化核心:SCTLR_EL2寄存器详解与配置实践
  • 抖音批量下载器终极指南:3分钟掌握无水印高效下载技巧
  • OpenRGB:终结RGB灯光管理混乱的终极免费方案
  • 健康系列: 有机食品是什么?
  • 5G网络仿真软件哪个更高效?Ranplan两款核心产品深度解析
  • ColabFold深度解析:如何在云端解锁蛋白质结构预测的民主化革命
  • 全国网站开发服务商哪家好?2026年有实力的网站开发公司盘点 - 麦麦唛
  • 天津离婚财产分割权威律师:家理姜春梅,专注婚家 10 年 + - 外贸老黄
  • 10分钟搭建微信小程序商城:海风小店开源方案完全指南
  • AArch64 SCTLR_EL3寄存器解析与安全配置实践
  • 构建你的第一个中文手写识别系统:免费开源数据集完整指南
  • Armv8/v9架构SCTLRMASK_EL2寄存器解析与应用
  • 浙江大电流端子/电压端子厂家有哪些?2026年浙江直插式/回拉式接线端子厂家推荐|浙江端子板源头厂家推荐:连的智能领衔 - 栗子测评
  • 抖音资源下载终极指南:3步免费搞定无水印批量下载
  • 深度解析:PC消光剂——原理、应用与实践方案 - 资讯速览
  • 每日热门skill:Firecrawl深度研究报告-AI时代的网页数据抓取神器
  • 5个步骤彻底解决FanControl风扇控制软件配置崩溃问题
  • 内卷时代,品牌官网如何成为企业突围的“第二增长曲线”?