gpt4 book ai didi

c++ - 为什么具有固定底层类型 char 的枚举值解析为 fct(int) 而不是 fct(char)?

转载 作者:IT老高 更新时间:2023-10-28 12:58:18 25 4
gpt4 key购买 nike

回答this question about overload resolution with 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:

The value of an enumerator or an object of an unscoped enumeration type is converted to an integer by integral promotion (4.5)

以及§4.5/4:

A prvalue of an unscoped enumeration type whose underlying type is fixed (7.2) can be converted to a prvalue of its underlying type. Moreover, if integral promotion can be applied to its underlying type, a prvalue of an unscoped enumeration type whose underlying type is fixed can also be converted to a prvalue of the promoted underlying type.

所以charEnum既可以转换成char,也可以是char的任何整体提升,例如int .

但这对我来说很模糊,因为“可以”并不能完全说明实际会选择哪个。如果有的话,这应该与此措辞模棱两可,因为在 char 或其任何促销之间没有优先考虑。如果您注释掉 fct(int),则调用 不明确。 int 为什么特别?

我唯一能想到的是积分提升是递归应用的,但我没有看到强制它。

最佳答案

在 C++03 中,规则是:

An rvalue of an unscoped enumeration type (7.2 [dcl.enum]) can be converted to an rvalue of the first of the following types that can represent all the values of the enumeration (i.e. the values in the range bmin to bmax as described in 7.2 [dcl.enum]): int, unsigned int, long int, unsigned long int, long long int, or unsigned long long int.

在 C++03 编译器中,会选择 int,因为它是第一个在名单上。


在 C++11 中,引入了底层类型。因此,通过 685. Integral promotion of enumeration ignores fixed underlying type ,此措辞已更改为您在 §4.5/4 中引用的段落,从阅读缺陷报告来看,委员会的意图似乎是选择 fct(char) (基础类型) .

但是,根据 core issue 1601 下的讨论, C++11 中的文本实际上使转换模棱两可(fct(char)fct(int) 都是可能的,两者都不是首选)。

C++14 提出并接受了以下修复:

A conversion that promotes an enumeration whose underlying type is fixed to its underlying type is better than one that promotes to the promoted underlying type, if the two are different.

由于它在 C++11 中被报告为缺陷,因此编译器应在 C++11 模式下应用此修复并调用 fct(char)

关于c++ - 为什么具有固定底层类型 char 的枚举值解析为 fct(int) 而不是 fct(char)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14206403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com