C ++ действительно невероятно трудно разобрать - гораздо сложнее, чем большинство других языков. Это очень непротиворечивый язык, но между токенизацией ввода и пониманием грамматического анализа синтаксиса делается так много работы, что вещи, которые кажутся простыми для компилятора, часто НЕ являются.
Исторический оператор ">>
" является оператором. Он «идентифицируется», поскольку исходный файл разбит на токены. Затем эти токены впоследствии «понимаются» в некотором контексте во время грамматического анализа (еще долго после завершения токенизации).
Если вы провели грамматический анализ , в то время как вы токенизировали, то у вас есть «подсказки», помогающие отличить то, что «>>
» следует рассматривать как два замыкания для объявления шаблона (или определения). Однако исторически сложилось так, как работают исторические компиляторы C ++. (Новые компиляторы делают больше обратной связи между грамматическим анализом и токенизацией, включая больше «заблаговременных действий», чтобы помочь устранить эти неоднозначности.)
Да, новый стандарт C ++ 0x меняет это и заставляет производителей компиляторов переписывать свои реализации, чтобы устранить неоднозначность ">>
" в вашем случае. Таким образом, это никогда не будет двусмысленным в будущем. Однако старые компиляторы C ++ не могут справиться с этим, поэтому может считаться «хорошей практикой», чтобы ваш код оставался совместимым с пробелом между символами «>
».