gpt4 book ai didi

c++ - 是否有任何关于为什么重新定义枚举器格式错误的规则?

转载 作者:行者123 更新时间:2023-12-04 05:47:27 24 4
gpt4 key购买 nike

考虑这个例子

enum class A{
a = 0,
a = 1
};
compilers会报错,就是“重新定义枚举器'a'”。然而, [basic.def.odr#1] 没有任何要求枚举器

No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, template, default argument for a parameter (for a function in a given scope), or default template argument.


我想知道标准中的哪个规范规则限制了它?

最佳答案

是的,截至目前,C++ 标准中的单一定义规则不包括枚举器。
但是,“第二个 a 是第一个 a 的重新声明”的解释也不起作用。
来自 [dcl.enum#nt:enumerator-list]我们可以知道 enumerator-list 是 enumerator-definition 的列表,所以它们都是定义。

enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition
为什么枚举数不包含在一个定义规则中?这可能是标准委员会的疏忽。 考虑到在 C 中,枚举器 禁止重新定义。
来自 the draft of C99 ,第 6.7 节:

5

A declaration specifies the interpretation and attributes of a set of identifiers. A definition of an identifier is a declaration for that identifier that:
— for an object, causes storage to be reserved for that object;
— for a function, includes the function body;101)
— for an enumeration constant or typedef name, is the (only) declaration of the identifier.


从 6.7.2.2 节我们可以看到一个枚举器是一个枚举常量:
enumerator:
enumeration-constant
enumeration-constant = constant-expression
从 6.7.2.2 还可以推断,枚举器列表中的所有枚举器将始终不仅被声明,而且 定义 .

3

The identifiers in an enumerator list are declared as constants that have type int and may appear wherever such are permitted.An enumerator with = defines its enumeration constant as the value of the constant expression. If the first enumerator has no =, the value of its enumeration constant is 0. Each subsequent enumerator with no = defines its enumeration constant as the value of the constant expression obtained by adding 1 to the value of the previous enumeration constant. (The use of enumerators with = may produce enumeration constants with values that duplicate other values in the same enumeration.) The enumerators of an enumeration are also known as its members.


因此,在 C 中,您不能多次定义具有相同标识符的枚举数,因为如果可以,它将不再是标识符的唯一声明,这使其成为根据第 6.7 节无效的定义。
C 中的行为可能是几乎所有 C++ 编译器禁止重新定义枚举器的原因,这也可能是 C++ 的预期或预期行为。

关于c++ - 是否有任何关于为什么重新定义枚举器格式错误的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68602375/

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