Nano Hash - криптовалюты, майнинг, программирование

Почему я не получаю предупреждения о несоответствии сравнения enum?

Рассмотрим этот код:

typedef enum Type1
{
    val11,
    val12
} Type1;

typedef enum Type2
{
    val21,
    val22
} Type2;

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

Visual Studio 2015 не выдает никаких предупреждений (даже с параметром /Wall). Однако type1 и val22 не одного типа. Это нормально или это ошибка Visual Studio?


  • если это что-то вроде перечислений С#, просто поддерживается целым числом, поэтому, если это верно в С++, возможно, это может быть эквивалентно if (type1 == 1) 30.11.2016
  • Это нормально. Обе части оператора равенства приводятся к int. 30.11.2016
  • Пишите современный код C++, используйте enum class. 30.11.2016
  • Здесь typedef бесполезен, если только определения enum не скомпилированы в C. 30.11.2016
  • @HansPassant: вызовет ли это предупреждение/ошибку компиляции? Не могли бы вы опубликовать это как ответ с примером? 30.11.2016
  • Примечание: g++ по умолчанию предупреждает: warning: comparison between ‘Type1 {aka enum Type1}’ and ‘enum Type2’ [-Wenum-compare]. 18.06.2017

Ответы:


1

Насколько мне известно, компилятор не обязан выдавать предупреждение при сравнении перечислений разных типов. В стандарте не нашел. Для классических перечислимых типов существует неявное преобразование типов в 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;
}
30.11.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..