Играя с C++, я обнаружил, что следующий код
enum E* kind;
int main() { }
компилируется на MSVC v19.latest. Я ожидал, что это не удастся, так как E
еще не объявлен. GCC и Clang выдают соответствующие сообщения об ошибках
ошибка: использование enum 'E' без предварительного объявления
и
ошибка: ISO C++ запрещает прямые ссылки на типы 'enum'
соответственно.
Почему приведенный выше код компилируется в MSVC? MSVC не соответствует стандарту? Это UB, баг или фича?
Почему приведенный выше код компилируется в MSVC?
Потому что вы компилируете с включенными расширениями Microsoft.
Как и во многих реализациях, MSVC незаметно включает их по умолчанию.
MSVC не соответствует стандарту?
Стандарт C++ говорит, что ваш код недействителен C++. Однако ничто не мешает реализации расширить язык C++, чтобы придать смысл программам, которые не являются допустимыми на C++. Это то, что MSVC делает здесь.
Если вы компилируете с отключенными языковыми расширениями , MSVC v19.latest отклонит его с сообщением об ошибке
error C3432: 'E': a forward declaration of an unscoped enumeration must have an underlying type