Проблема в том, что грамматика языка не зависит от контекста. Когда программа использует токены с помощью лексера, она использует метод, называемый maximal munch , что означает, что она всегда берет самую длинную возможную строку, которая может обозначать токен. Это означает, что >>
рассматривается как правильный оператор смещения битов. Итак, если у вас есть что-то вроде vector<pair<int, int>>
, то >>
на конце обрабатывается как правильный оператор смещения битов, а не как часть создания шаблона. Чтобы он по-другому воспринимал >>
в этом контексте, он должен быть контекстно- чувствительным вместо контекста- свободным - то есть он должен фактически заботиться о контексте существа токенов разобран. Это значительно усложняет лексер и парсер. Чем сложнее лексер и синтаксический анализатор, тем выше риск ошибок - и, что более важно, тем труднее инструментам их реализовать, а значит, меньше инструментов. Когда такие вещи, как подсветка синтаксиса в IDE или редакторе кода, становятся сложными для реализации, это становится проблемой.
Используя !()
- что приведет к vector!(pair!(int, int))
для того же объявления - D позволяет избежать проблемы чувствительности к контексту. D сделал ряд таких выборов в своей грамматике в явном виде с целью облегчить инструментам реализацию лексизации или синтаксического анализа, когда им нужно, чтобы делать то, что они делают. И поскольку на самом деле нет никакого недостатка в использовании !()
для шаблонов, кроме того факта, что это немного чуждо программистам, которые использовали шаблоны или дженерики в других языках, использующих <>
, это правильный выбор дизайна языка.
И как часто вы используете или не используете шаблоны, которые могут создавать неоднозначности при использовании синтаксиса угловых скобок - например, vector<pair<int, int>>
- на самом деле не имеет отношения к языку. Инструменты должны реализовать это независимо. Решение использовать !()
вместо <>
полностью зависит от упрощения языка для инструментов, а не для программиста. И хотя вам может или не может нравиться синтаксис !()
, он довольно прост в использовании, поэтому в конечном итоге он не доставляет программистам никаких проблем, помимо изучения его и того факта, что он может идти вразрез с их личными предпочтениями.