这个问题是在用 enums 回答关于重载解析的问题时出现的。
虽然这种情况long long
肯定是 MSVC2012NovCTP 中的一个错误(根据标准文本和 gcc 4.7.1 的测试),但我无法弄清楚为什么会发生以下行为:
#include <iostream>
enum charEnum : char { A = 'A' };
void fct(char) { std::cout << "fct(char)" << std::endl; }
void fct(int) { std::cout << "fct(int)" << std::endl; }
void fct(long long) { std::cout << "fct(long long)" << std::endl; }
int main()
{
fct('A');
fct(A);
}
MSVC2012NovCTP 和 gcc 4.7.1 都同意这个输出:
fct(char)
fct(int)
不A
应该从转换charEnum
为char
?为什么A
被转换为int
?
编辑:clang 抱怨这个电话是模棱两可的,这与我在下面的解释一致;也就是说,如果仅将其视为基础类型,我仍然会发现它更加直观。
两个相关的标准摘录是§7.2/9:
枚举数或无作用域枚举类型的对象的值通过整数提升(4.5)转换为整数
和§4.5/4:
其基础类型是固定的(7.2)的无作用域枚举类型的纯右值可以转换为其基础类型的纯右值。此外,如果可以将整型提升应用于其基础类型,则其基础类型固定的无范围枚举类型的纯右值也可以转换为提升的基础类型的纯右值。
所以charEnum
既可以转换为char
,也可以是任何整数提升char
,例如int
.
但这对我来说很模糊,因为“可以”并不能完全说明实际会选择哪个。如果有的话,这应该与这个措辞模棱两可,因为在任何促销活动之间char
或任何促销活动之间都没有优先考虑。如果您注释掉fct(int)
,则该调用是模棱两可的。为什么int
特别?
我唯一能想到的是积分提升是递归应用的,但我没有看到任何强制它。