【问题标题】:Is this (enum : char {}) a gcc bug?这是 (enum : char {}) 一个 gcc 错误吗?
【发布时间】:2013-10-17 10:01:16
【问题描述】:

在 gcc-4.5 下,打印 0,在 gcc-4.6 下,打印 1。

#include <iostream>

enum VenueId: char {}; 
int
main (int argc, char ** argv)
{
  VenueId v = (VenueId)'P';
  std::cout << (v=='P') << std::endl;
  return 0;
}

【问题讨论】:

  • 我猜这样的转换是未定义的,但我找不到合适的标准 :-(
  • 定义明确。 GCC 4.5 有问题。
  • 在 Ubuntu 12.04 中使用最新版本的 g++-4.5,这显然已得到修复,因为它也打印出 1。另外生成的程序集(Intel风格)无非是mov BYTE PTR [rbp-0x1],0x50,对应VenueId v = (VenueId)'P';cmp BYTE PTR [rbp-0x1],0x50,对应比较,如你所见,0x50 == 0x50
  • 关于 C++11 特性,我的经验法则是:gcc 4.5 = pre-alpha, 4.6 = alpha, 4.7 = beta, 4.8 = release

标签: c++ gcc c++11 enums


【解决方案1】:

按照标准,VenuedId 具有 char 类型作为基础类型,所以 v 应该包含字符 'P'v == 'P' 应该产生 true .

§ 7.2 枚举声明

每个枚举都定义了一个不同于所有其他类型的类型。每个枚举也有一个基础类型。 可以使用 enum-base 显式指定底层类型;如果未明确指定,则作用域枚举类型的基础类型是 int。在这些情况下,基础类型被称为是固定的。 在数字说明符的右大括号之后,每个枚举器都有其枚举的类型。

【讨论】:

  • 那么它是 GCC 中的一个错误吗?
  • 它是,如问题的 cmets 所述。
  • 关于在枚举中存储基础类型的任何成员的能力的段落将完善这个答案。
  • 7.2/7 "对于基础类型固定的枚举,枚举的值是基础类型的值。[...]由它的任何枚举器定义。”
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-18
  • 2012-03-25
  • 2010-12-22
相关资源
最近更新 更多