当前位置: 首页 > 知识库问答 >
问题:

为什么我没有收到枚举比较不匹配的警告?[副本]

范翰飞
2023-03-14

考虑以下代码

typedef enum Type1
{
    val11,
    val12
} Type1;

typedef enum Type2
{
    val21,
    val22
} Type2;

Type1 type1 = val11;
if ( type1 == val22 )
    std::cout << "foo";

Visual Studio 2015不会发出任何警告(即使使用/墙)。但是,类型1和val22不属于同一类型。这是正常的还是Visual Studio错误?

共有1个答案

胡翔
2023-03-14

据我所知,编译器没有义务在比较不同类型的枚举时发出警告。我在标准中找不到它。对于经典枚举类型,存在到int的隐式类型转换,因此生成的代码完全合法。从语义上讲,比较不同类型的枚举通常是不正确的,因此,由于C,我们有一个作用域枚举结构,它不允许隐式转换。(参见下面的代码)。

#include <iostream>
using namespace std;

enum UE1 // This is an unscoped enumeration (since C)
{
    val11,
    val12
};

enum UE2 // This is an unscoped enumeration too
{
    val21, // have to use different names for enumeration constants
    val22
};

enum class SE1 // This is an scoped enumeration (since C++11)
{
    val1,
    val2
};

enum class SE2
{
    val1, // can use the same names for the constants
    val2  // because they are in the different scope
};

int main(int, char**)
{
    if (val11 == val22) // implicit conversion from an enum to int is available
        cout << "UE::val11 is equal to UE::val22" << endl;

    if (static_cast<int>(SE1::val1) == static_cast<int>(SE2::val1)) // have to apply explicit conversion
        cout << "SE1::val1 is equal to SE2::val1" << endl;

    if (SE1::val1 == SE2::val1) // error!!! Cannot make implicit conversions from a scoped enumeration.
        cout << "SE1::val1 is equal to SE2::val1" << endl;

    return 0;
}
 类似资料:
  • 因为枚举成员不是有序的,所以它们只支持通过标识(identity) 和相等性 (equality) 进行比较。下面来看看 == 和 is 的使用: #!/usr/bin/env python3 # -*- coding: UTF-8 -*- from enum import Enum class User(Enum): Twowater = 98 Liangdianshui

  • 我不明白为什么我收到以下代码的警告: 未选中对<code>isAssignableFrom(类)的调用 当我使用< code>isInstance方法时(根据我的理解,它提供相同的结果),我没有得到警告:

  • 实现后缀计算器,需要检查运算符的优先级是否低于另一个运算符。以下是我到目前为止所拥有的: 我尝试了许多不同的方法来检查传入的字符的优先级,但都没有用。有没有简单的方法来比较一个枚举的两个值?我需要创建一个循环吗?

  • 问题内容: 我正在学习Java和OOPS,并在日食中编写基本的Hello World时,我看到一个黄色三角形,告诉我 “实用程序类不应具有公共或默认构造函数” 。我不明白为什么会这样,这是什么意思?我在做什么不对? EDIT1:编辑代码以包括建议的更改。 仍然在类HelloWorld上收到警报。 编辑2: 创建了一个新类,现在可以使用了。谢谢乔恩,为什么旧​​班级还会发出警告?波希米亚语我仍然不知

  • 到目前为止,我有这个: 和这个: 当我测试这个时,它不能采取双倍数字,我收到这个消息: 我该如何解决这个问题?

  • 这里有2个测量: 正如您所见,比较两个匹配的字符串比比较两个大小相同但不匹配的字符串要快。这是非常令人不安的:在字符串比较期间,我认为python是逐字符测试字符串的,所以应该比更长,因为它需要对1进行4次测试才能进行不匹配的比较。可能比较是基于哈希的,但在这种情况下,两种比较的计时应该相同。 你知道为什么吗?