Для вложенных шаблонов, когда `>>` стал стандартным C ++ (вместо `>>`)? - PullRequest
26 голосов
/ 17 августа 2011

Кажется, я вспоминаю, что в былые времена меня предупреждали о том, что нельзя ставить два символа > рядом друг с другом (без пробела) при работе с параметрами вложенного шаблона. Я даже смутно помню, как объявлял векторы векторов чего-либо и сталкивался с этой ошибкой компиляции.

Но теперь я обнаружил, что нет ничего плохого в компиляции страшных >> ...

Мои вопросы таковы:

В какой момент эта конвенция стала приемлемой практикой?

Является ли это частью стандарта C ++?

Всегда ли это было частью стандарта, а компиляторы, которые я использовал (и профессора, которые у меня были) в колледже, просто еще не поддерживали его?

Может быть, эти вопросы немного исторические, но для меня кажется, что надлежащий исторический контекст делает фактическое вспоминание тривиальным.

Ответы [ 4 ]

24 голосов
/ 17 августа 2011

Шаблоны, закрытые вложенными >>, официально поддерживаются в соответствии со следующим стандартом C ++ 0x (теперь C ++ 11).Раньше вам понадобилось место или компилятор, который потратил на вас лишнюю милю (и сделал то, что не указано в стандарте).

Проблема связана с тем, что >> в C является правильнымоператор сдвига, который является одним лексическим токеном, который конфликтует с двумя отдельными токенами >, которые понадобятся на этапе синтаксического анализа в классически скомпилированном компиляторе C ++ (и только в случае шаблонов, а не тогда, когда он на самом деле являетсясдвиг вправо).Другими словами, >>, если ему разрешено закрывать вложенные шаблоны, является лексически неоднозначным, но это может быть (и в настоящее время) решается с помощью дополнительной сложности во время синтаксического анализа (что в современном C ++ на самом деле не является чем-то новым).

3 голосов
/ 17 августа 2011

Синтаксис двойных угловых скобок в шаблонах по-прежнему недопустим в C ++, но некоторые компиляторы (в частности, Visual Studio) в любом случае допускают это.В C ++ 0x, который был только что ратифицирован и ожидает публикации, это было исправлено.

Короче говоря, это все еще не разрешенный C ++, но скоро будет.Компиляторы Sme допускают это, но, поскольку не все, вы все равно должны ставить пробелы в угловых скобках.Через два-три года вам это больше не понадобится.

Надеюсь, это поможет!

1 голос
/ 17 августа 2011

Этого не было в стандарте (до недавнего времени - несколько дней назад).

Почему?

Одно слово: эффективность.

Запрет, которые делают контекст грамматики свободным. Это делает компилятор немного быстрее. В старые добрые времена каждый бит имеет значение. Теперь, с развитием как алгоритма, так и аппаратного обеспечения, никто не хочет этой проблемы.

1 голос
/ 17 августа 2011

C ++ 0x.Вы можете взглянуть на этот мой вопрос для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...