C++ 为什么使用非范围枚举';宣言汇编?
在Scott Meyers的C++ 为什么使用非范围枚举';宣言汇编?,c++,c++11,enums,C++,C++11,Enums,在Scott Meyers的高效现代C++一书中提到,非作用域枚举和作用域枚举(enum类)之间的主要区别之一是我们不能向前声明前者(参见第3章第10项-“首选作用域枚举而非非作用域枚举”)。例如: enum Color; *// error!* enum class Color; *// fine* 但我在下面提到了一个小例子,并发现事实并非如此 测试.h #pragma once enum names; void print(names n); 测试.cp
高效现代C++
一书中提到,非作用域枚举和作用域枚举(enum类)之间的主要区别之一是我们不能向前声明前者(参见第3章第10项-“首选作用域枚举而非非作用域枚举”)。例如:
enum Color; *// error!*
enum class Color; *// fine*
但我在下面提到了一个小例子,并发现事实并非如此
测试.h
#pragma once
enum names;
void print(names n);
测试.cpp
#include "test.h"
#include <iostream>
enum names { John, Bob, David };
void print(names n)
{
switch (n)
{
case John:
case Bob:
case David:
std::cout << "First names." << std::endl;
break;
default:
std::cout << "Other things" << std::endl;
};
}
#include "test.h"
#include <iostream>
int main()
{
names n = static_cast<names>(2);
print(n);
return 0;
}
#包括“test.h”
#包括
枚举名称{约翰、鲍勃、大卫};
作废打印(名称n)
{
开关(n)
{
案例约翰:
案例鲍勃:
案例大卫:
std::coutc++11
第一:C++ 11允许对未受限制的枚举进行正向声明。您只需将基础类型提交给编译器(例如,有效的现代C++,第3章,第10条):
您使用的是编译器的非标准扩展,但无论如何都是可能的
重要与否
Scott Meyers在引用的章节中说:
与非作用域相比,作用域枚举似乎有第三个优势
枚举,因为作用域枚举可能是前向声明的,即它们的名称
可以在不指定其枚举数的情况下声明:
[…]英寸
C++11,未作用域枚举也可以向前声明,但只能在
一些额外的工作
“可能看起来”是“是”的对立面.Scott Meyers自己表示,这不是该书中的一个重要功能。这不是Visual Studio 2017中编译的-因此听起来可能是编译器错误或编译器特定的扩展。这是MSVC编译器中的一个缺陷。它甚至使用/permission-
成功编译,这迫使MSVC进入一致性模式。@您使用的是什么MSVC版本?对我来说,它在19.11.25508.2和19.11.25545上都成功地编译了/permissive-
。@tambre我使用的是MSVC 19.11.25506,即使没有/permissive-
我也会得到错误“C3432的名称”:非作用域枚举的前向声明必须具有基础类型”@tambre我尝试升级到MSVC 19.11.25508.2,但仍然收到与以前相同的错误-编辑:我的项目在设置中有/Za
(禁用语言扩展)-删除它确实允许编译此代码
enum Color: std::uint8_t;