Разница между этими двумя объявлениями
enum colour {blue, green, red};
typedef enum {blue, green, red} colour;
влияет на поиск имени.
Для первого объявления, даже если имя colour
скрыто, вы можете использовать сложный имя enum colour
Вот демонстрационная программа
#include <iostream>
enum colour {blue, green, red};
int colour;
enum colour c = red;
int main()
{
return 0;
}.
Фактически для первого объявления вы вводите два имени: enum colour
и colour
Для объявление typedef имя тега опущено. Поэтому вы не можете использовать подробное имя.
Также без ключевого слова enum вы не можете использовать непрозрачное объявление enum. И вы не можете вводить перечисления с областью видимости, такие как
enum class colour {blue, green, red};