Я полагаю, что предвиденная трудность заключалась в том, что два экземпляра Foo<T>
фактически означали совершенно разные вещи, потому что T
не было одинаковым для обоих.Несколько ранних реализаций шаблонов (включая cfront) использовали репозиторий экземпляров шаблонов, поэтому компилятор мог автоматически создавать экземпляр шаблона над требуемым типом, когда / если было обнаружено, что экземпляр этого типа еще не был в репозитории.
Чтобы это работало с локальными типами, хранилище не просто могло бы хранить тип, для которого был создан экземпляр шаблона, но вместо этого ему нужно было бы сделать что-то вроде создания полного «пути» квведите для экземпляра.Хотя это, вероятно, возможно, я думаю, что это было воспринято как большая дополнительная работа для небольшой (если вообще есть) реальной выгоды.
С тех пор правила изменились настолько, что компилятору уже требуется делать что-то,об эквивалентных, нахождении (и объединении) экземпляров одного и того же типа в разных местах (в том числе в разных TU), чтобы два экземпляра foo<int>
(например) не нарушали ODR.Исходя из этой реализации, ограничение было ослаблено в (текущем наброске) C ++ 0x (вы все еще не можете создать экземпляр класса шаблона для локального типа, но вы можете использовать локальный тип в качестве параметра для функции шаблона).