1

我正在使用 Visual Studio 2012 编译此 C++ 代码。我注意到我可以在没有范围解析运算符 (::) 的情况下使用枚举值。

这是我的代码在 int main() 之外的重要部分:

enum SortMethod
{
    BY_NAME,
    BY_WEIGHT
};

然后在 int main() 我使用以下内容:

int main()
{
    LinkedList* list = new LinkedList();
    /*
        Insert values into linked list, in sorted order.
    */
    list->print( BY_NAME );
    cout << endl << endl;
    list->print( BY_WEIGHT );

    return 0;
}

为什么这些函数调用有效?print() 函数接受一个 SortMethod 参数。所以我想我需要做以下事情:

SortMethod sortByName = BY_NAME;
list->print( sortByName );

但事实证明,我可以简单地在参数列表中使用“BY_NAME”。这是特定于编译器的吗?

4

3 回答 3

2

那是因为它是无范围的枚举器,因此每个枚举器都可以在与枚举名称本身相同的范围内使用。范围枚举器需要使用::. 这在C++ 标准草案标准部分7.2 枚举声明10段中进行了介绍,其中说:

每个 enum-name 和每个 unscoped enumerator 都在立即包含 enum-specifier 的范围内声明。每个作用域枚举器都在枚举范围内声明。这些名称遵守 (3.3) 和 (3.4) 中为所有名称定义的范围规则。

并提供以下示例,第一个示例direction使用无作用域枚举器,不需要使用,::但第二个示例使用altitude作用域因此需要使用::

enum direction { left=’l’, right=’r’ };

void g() {
  direction d; // OK
  d = left; // OK
  d = direction::right; // OK
}

enum class altitude { high=’h’, low=’l’ };

void h() {
  altitude a; // OK
  a = high; // error: high not in scope
  a = altitude::low; // OK
}
于 2014-03-15T02:07:42.837 回答
0

C++ 枚举器总是在包含枚举的范围内声明。C++11 添加了使用enum 类而不是enum关键字定义的“作用域枚举器” 。

于 2014-03-15T02:08:47.737 回答
0

没有。 enums 只是ints。默认情况下,这些值从零开始编号,因此您的枚举被隐式声明为:

enum SortMethod
{
    BY_NAME = 0,
    BY_WEIGHT = 1
}

因此,这些值可以在任何可以使用整数的地方使用。

如果您使用作用域枚举器,它会变得更加复杂。

于 2014-03-15T02:09:27.717 回答