【发布时间】:2021-06-29 23:42:33
【问题描述】:
你好,我有这个来自 C++ 入门第 5 版:
// unscoped enumeration; the underlying type is machine dependent
enum Tokens {INLINE = 128, VIRTUAL = 129};
void newf(unsigned char);
void newf(int);
unsigned char uc = VIRTUAL;
newf(VIRTUAL); // calls newf(int)
newf(uc); // calls newf(unsigned char)
enum令牌只有两个枚举器,其中较大的一个具有值129。该值可以用unsigned char类型表示,许多编译器将使用unsigned char作为Token 的底层类型。无论其基础类型如何,Tokens的对象和枚举数都被提升为int。enum类型的枚举数和值不会提升为unsigned char,即使枚举数的值适合。
-
但是如果我明确指定与函数参数的整数值完全匹配的底层类型,那么我认为不会发生隐式转换:
enum days : unsigned char{sat = 1, sun, mon, tue, wed, thu, fri}; void foo(unsigned char x){ std::cout << "foo(unsigned char)\n"; } void foo(int){ std::cout << "foo(int)\n"; } foo(tue); // foo(unsigend char)
所以你可以看到枚举值tue 没有提升为int,我得到的是foo(unsigned char) 的版本而不是foo(int)。
-
那么他的意思是,如果枚举基础类型与函数参数不同,那么枚举数不会提升为
char,而是提升为int或大整数类型? -
我认为在他的
enum tokens示例中,如果底层类型是unsigned char,那么函数调用中将不会有整体提升:newf(VIRTUAL); // calls newf(int)并且选择了newf(unsigned char)的版本。你怎么看?
【问题讨论】:
-
无关:为什么对一个十年前的编程文本的怪癖突然引起了人们的兴趣?大学最终决定将教学大纲更新到这个千年,但认为他们应该只进行一半吗?
-
“我认为不会发生隐式转换”。您是否尝试过自己运行代码?结果是否与您的预期不同,您想知道原因吗?结果是否符合您的预期,但您希望确认您的推理是正确的?
-
我认为你把事情搞混了。对于具有未指定类型的
enum,可能必须进行提升,但由于您没有使用具有未指定类型的enum,而是按名称要求unsigned char,unsigned char看起来更适合。可以推广,但这里没必要。 -
也许我们都从最近的 C++ 标准来看它,无法真正理解这本书试图表达的观点。让我写一个 hack 示例来看看会发生什么。
-
嗯。那里的编译器之间似乎存在很多分歧。似乎标准中的一些实际引用确实与此处相关。
标签: c++ enums implicit-conversion integer-promotion