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的临时对象,这里适用复制初始化的重载决议规则:- 候选构造函数1
S(int):需要将MyEnum类型的A隐式转换为int,属于转换匹配等级 - 候选构造函数2
S(MyEnum):参数类型和实参A完全一致,属于精确匹配等级
- 候选构造函数1
- C++标准明确规定重载决议时精确匹配的优先级高于转换匹配,因此编译器一定会选择
S(MyEnum)构造函数,输出MyEnum。
内容的提问来源于stack exchange,提问作者khuttun
相关产品推荐
相关产品推荐

