You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重载与volatile关键字:为何不同C++编译器对同一函数调用的判定存在分歧?

重载与volatile关键字:为何不同C++编译器对同一函数调用的判定存在分歧?

咱们先来看这段有意思的C++代码,它在不同编译器下的表现居然大相径庭,这背后的原因到底是什么呢?

struct S {};

void foo(volatile S&);
void foo(S);

int main() {
    volatile S v;
    foo(v);
}

不同编译器对这段代码的判定完全不一致:MSVC会直接接受这段代码,但Clang和GCC却会报错,说foo(v)这个函数调用存在歧义。

但实际上,我们可以通过验证来证明,只有第一个重载候选函数才能匹配v这个参数:

  • 如果只保留第一个重载void foo(volatile S&);,所有编译器都能顺利编译这段代码;
  • 如果只保留第二个重载void foo(S);,所有编译器都会报错——因为S并没有提供从volatile S&进行拷贝构造的构造函数,无法完成参数的转换。

编辑补充:在这个问题发布之后,有人还提出了一个更简单的例子,哪怕不使用volatile关键字,也能复现类似的编译器分歧情况。

备注:内容来源于stack exchange,提问作者Dr. Gut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:29:35