Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用非范围枚举';宣言汇编?_C++_C++11_Enums - Fatal编程技术网

C++ 为什么使用非范围枚举';宣言汇编?

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

在Scott Meyers的
高效现代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;