跳转至

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。

查看固定 commit 源码 · 返回证据索引