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

C++是否保证枚举与int类型的构造函数重载决议结果符合标准?

问题解答

结论

该行为完全由C++标准明确保证,所有符合标准的编译器都应该输出MyEnum。

核心代码回顾

#include <iostream>

typedef enum { A, B, C } MyEnum;

struct S
{
    S(int) { std::cout << "int" << std::endl; }
    S(MyEnum) { std::cout << "MyEnum" << std::endl; }
};

S f()
{
    return A;
}

int main()
{
    S const s = f();
}

规则依据

  • 首先A是MyEnum类型的枚举值,本身是独立的类型,和int不属于同一类型。虽然C++中无作用域枚举可以隐式转换为整型,但这是需要额外执行一步转换操作的。
  • return A;语句需要构造返回值类型S的临时对象,这里适用复制初始化的重载决议规则:
    • 候选构造函数1S(int):需要将MyEnum类型的A隐式转换为int,属于转换匹配等级
    • 候选构造函数2S(MyEnum):参数类型和实参A完全一致,属于精确匹配等级
  • C++标准明确规定重载决议时精确匹配的优先级高于转换匹配,因此编译器一定会选择S(MyEnum)构造函数,输出MyEnum。

内容的提问来源于stack exchange,提问作者khuttun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:15:08