Непосредственная проблема в C ++ состоит в том, что аргумент шаблона может фактически включать выражения: константные выражения являются совершенно допустимыми аргументами шаблона. Я не думаю, что это правда в Java. Вот пример, где выражение может испортить вещи:
std::list<std::bitset<32 >> 2> > list_of_bitset8s;
Тем не менее, исходное правило было навязано, по существу, для сохранения существующих синтаксических анализаторов C ++, которые имели тенденцию использовать относительно простой лексический анализ, который был по существу построен на основе контекстно-свободных регулярных выражений. Кроме того, когда были добавлены шаблоны, никто не ожидал, что вложенные шаблоны будут часто использоваться. Как оказалось, и в C ++ 2011 исправлена проблема, позволившая использовать закрывающие угловые скобки без использования пробелов. Чтобы устранить неоднозначность в тех редких случаях, когда необходимо использовать выражение, использующее оператор смещения вправо, в качестве круглой скобки для параметра шаблона, то есть вышеупомянутое объявление допустимо в C ++ 2003 и недопустимо в C ++ 2011. Должен быть заменен на
std::list<std::bitset<(32 >> 2)>> list_of_bitset8s;
(ну, при необходимости закрывающие угловые скобки могут продолжать использовать пробелы).
Конечно, это неполное исправление, потому что следующее все еще незаконно:
::std::list<::std::bitset<8>> list of bitset8s;