GCC: тип перечисления Unscoped дает ошибку неоднозначности

В следующем коде, я определен перечисление С long long тип. Эта программа отлично работает на лязгом.

но GCC компилятор дает ошибку неоднозначности.

#include <iostream>

enum : long long { Var=5 };

void fun(long long ll)
{
    std::cout << "long long : " << ll << std::endl;
}

void fun(int i)
{
    std::cout << "int : " << i <<  std::endl;
}

int main()
{
    fun(Var);
}

GCC генерируется ошибка:

main.cpp: In function 'int main()':
main.cpp:17:12: error: call of overloaded 'fun(<unnamed enum>)' is ambiguous
     fun(Var);
            ^
main.cpp:5:6: note: candidate: void fun(long long int)
 void fun(long long ll)
      ^~~
main.cpp:10:6: note: candidate: void fun(int)
 void fun(int i)
      ^~~

почему компилятор GCC дает ошибку неоднозначности?

1 ответов


GCC ошибается.

преобразование типа перечисления Без области в базовый тип квалифицируется как комплексное продвижение:

тип перечисления без области, базовый тип которого фиксирован, может быть преобразован в базовый тип ... (начиная с C++11)

, а для Var преобразование int требуется еще один интегральные преобразования (от long long to int). комплексное продвижение есть более высокий рейтинг, чем интегральные преобразования на перегрузка разрешение:

2) продвижение: объединенное продвижение, продвижение с плавающей запятой

3) преобразование: интегральное преобразование, преобразование с плавающей запятой, плавающее интегральное преобразование, преобразование указателя, указатель на элемент преобразование, логическое преобразование, пользовательское преобразование производного class to its base

затем fun(long long ll) должно быть лучше спичка.


здесьотчет об ошибке gcc; он был исправлен в 2017-10-24. LIVE