Не вижу веской причины, по которой имя typedef отличается от имени тега.
Теперь причина, по которой имя тега нужно определить по типу, если вы не хотите использовать
struct tag v;
но
* +1007 *
вероятно исторический. Насколько я помню, C имел typedef, но я не знаю, было ли это так, когда было введено struct
(обработка typedef - неприятность в грамматике C). В старом коде, который я видел, использование typedef для struct еще не сделано, и есть такие вещи, как unix
struct stat;
int stat(const char*, struct stat*);
, который порвался бы с автоматическим определением типа. Один из них представлен, изменение довольно сложно (да, C ++ имеет автоматическое определение типа, но C ++ имеет специальную формулировку для обработки этого случая перегрузки, и это будет еще одним осложнением).