Шаблоны в C ++, Generics в Java и оператор >> сдвиг битов - PullRequest
3 голосов
/ 27 февраля 2012

Мой актуальный вопрос таков:

В C ++ вложенные параметры должны иметь пробел между ними, например List< List<String> >. Это сделано так, что компилятор может различать вышеприведенное и битовое смещение >>. Но то же самое не верно для Java List<List<String>> совершенно правильно. Как JVM различает вышеприведенное и >> битовое смещение?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2012

Разница в контексте, который окружает предполагаемый >> оператор.Когда это оператор, выражение ожидается для обоих операндов:

EXPR >> EXPR

Выражение может быть переменной, литералом, вызовом функции или сложной комбинацией всех этих элементов.В то время как в случае объявления списка, однако, нет никаких вовлеченных выражений, только типы и идентификаторы.Например:

List<List<string >> id;

На самом деле, в новом стандарте компилятор C ++ также способен изменить ситуацию.

4 голосов
/ 27 февраля 2012

Непосредственная проблема в 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;
3 голосов
/ 27 февраля 2012

В Java операторы типа << не могут быть перегружены программистом.Как следствие, число мест, где действует оператор <<, гораздо более ограничено, чем в C ++, и компилятор всегда может выяснить, что имеется в виду, когда он видит «<<» в исходном коде. </p>

...