Для вложенных шаблонов, когда `>>` стал стандартным C++ (вместо `> >`)?
Кажется, я вспоминаю, что в былые времена меня предостерегали от >
символы рядом друг с другом (без пробела) при работе с вложенными параметрами шаблона. Я даже смутно помню, как объявлял векторы векторов чего-либо и сталкивался с этой ошибкой компиляции.
Но теперь я нахожу, что нет ничего плохого в составлении страшных >>
...
Мой вопрос (ы), таким образом:
В какой момент эта конвенция стала приемлемой практикой?
Это часть стандарта C++?
Всегда ли это было частью стандарта, а компиляторы, которые я использовал (и профессора, которые у меня были) в колледже, просто еще не поддерживали его?
Возможно, эти вопросы немного исторические, но для меня кажется, что надлежащий исторический контекст делает фактическое вспоминание тривиальным.
4 ответа
Шаблоны закрываются с вложенными >>
официально поддерживаются новым стандартом C++0x (теперь C++11). Раньше вам понадобилось место или компилятор, который потратил на вас лишние усилия (и делал то, что не указано в стандарте).
Проблема связана с тем, что >>
в C - оператор сдвига вправо, представляющий собой один лексический токен, который конфликтует с двумя отдельными >
токены, которые понадобятся на этапе синтаксического анализа в классически скомпилированном компиляторе C++ (и только в случае шаблонов, а не тогда, когда это действительно сдвиг вправо). Другими словами, >>
Если разрешено закрывать вложенные шаблоны, это лексически неоднозначно, но это может быть (и в настоящее время) решается с помощью дополнительной сложности во время синтаксического анализа (что в современном C++ на самом деле не является чем-то новым).
Синтаксис двойных угловых скобок в шаблонах все еще недопустим в C++, но некоторые компиляторы (особенно Visual Studio) в любом случае допускают это. В C++0x, который был только что ратифицирован и ожидает публикации, это было исправлено.
Короче говоря, это все еще не легальный C++, но скоро будет. Компиляторы Sme допускают это, но поскольку не все это делают, вы все равно должны ставить пробелы в угловых скобках. Через два или три года вам это больше не понадобится.
Надеюсь это поможет!
C++0x. Вы можете взглянуть на мой вопрос для получения дополнительной информации.
Этого не было в стандарте (до недавнего времени - несколько дней назад).
Зачем?
Одним словом: эффективность.
Отказ от этого делает контекст грамматики свободным. Это делает компилятор немного быстрее. В старые добрые времена каждый бит имеет значение. Теперь, с развитием как алгоритма, так и оборудования, никто не хочет этой проблемы.