ev-mold-variant-get-if-value-002¶
| 字段 | 值 |
|---|---|
| 项目 | rui314/mold |
| 固定 commit | 27162691b71a |
| 路径 | src/passes.cc |
| 行段 | L2908-L2921 |
| 特性 | std::variant |
| 许可证 | MIT |
| 代码来源 | 项目源码 |
| 级别 | manual |
| 审核 | zyuhao7 @ 2026-10-25 |
| 测试代码 | 否 |
| 发现方式 | tree-sitter |
用法¶
先用 get_if 判断活动成员,再在 else 分支用 get 取另一成员
为什么典型¶
只有两个分支时,get_if 返回的非空指针同时完成“是否是该类型”和“取出值”两件事;else 分支已确定类型,再用 get 无需重复检查。
摘录¶
for (i64 i = 0; i < ctx.arg.defsyms.size(); i++) {
Symbol<E> *sym = ctx.arg.defsyms[i].first;
std::variant<Symbol<E> *, u64> val = ctx.arg.defsyms[i].second;
if (u64 *addr = std::get_if<u64>(&val)) {
sym->origin = 0;
sym->value = *addr;
} else {
Symbol<E> *sym2 = std::get<Symbol<E> *>(val);
sym->value = sym2->value;
sym->origin = sym2->origin;
sym->visibility = sym2->visibility.load();
}
}
备注¶
生产路径;值拷贝自 vector 元素,避免在循环中通过引用持有可变的 variant。