Для такого кода:
typedef enum FooEnum : int FooEnum;
enum FooEnum : int { A = 1, B };
clang (linux / 7.0.0) не сообщает об ошибках [-c -std=c++11 -pedantic
], но gcc (linux / 8.2.1) не компилирует его:
g++ -c -std=c++11 -pedantic test2.cpp
test2.cpp:1:28: error: expected ';' or '{' before 'FooEnum'
typedef enum FooEnum : int FooEnum;
^~~~~~~
test2.cpp:1:28: error: expected class-key before 'FooEnum'
test2.cpp:2:16: error: using typedef-name 'FooEnum' after 'enum'
enum FooEnum : int { A = 1, B };
^~~
test2.cpp:1:28: note: 'FooEnum' has a previous declaration here
typedef enum FooEnum : int FooEnum;
На самом деле я понятия не имею, зачем использовать typedef для enum в C ++, но вопрос в том, что это ошибка в clang, потому что она принимает неверный код, или это ошибка в стандарте c ++ 11, которая допускает разныереализация?
Обновление: как мне объяснили, первый typedef используется для совместимости с objc ++, чтобы использовать тот же заголовок при компиляции кода c ++ и objc ++.