Clang 12编译C++重载代码未出现预期ambiguity error问题
问题原因分析
该现象由Clang针对Windows MSVC目标的默认兼容规则导致,并非Clang版本bug,也不属于对C++隐式转换规则的理解错误:
- 你当前的编译目标为
x86_64-pc-windows-msvc,Clang默认开启-fms-compatibility(MSVC兼容模式),该模式会复用MSVC的非标准重载解析逻辑:整数类型间的转换优先级高于整数转浮点类型的转换优先级。 - 按照标准C++规则,
long转int属于整数转换,long转double属于浮点转换,二者属于同一优先级的隐式转换,确实应该触发二义性错误;但在MSVC兼容规则下,整数转换被人为赋予更高优先级,因此编译器直接选择了print(int)版本的重载。 - 你可以通过添加编译参数
-fno-ms-compatibility关闭MSVC兼容,此时Clang会严格遵循C++标准输出二义性报错,符合你的预期。如果不需要关闭兼容模式,也可以添加-Wall编译参数,编译器会针对这类非标准的重载选择给出警告提示。
内容的提问来源于stack exchange,提问作者JakubGamer
相关产品推荐
相关产品推荐

