重载与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
相关产品推荐
相关产品推荐

