Вложенные шаблоны и оператор сдвига

Я читал все о том, что нужно знать >> как конец вложенного шаблона и >> как оператор сдвига...

Теперь я попробовал это в своем MSVS2010, и никаких проблем не возникло.

std::map<int, std::pair<int, int>> m;

Этот код работает именно так, как я хочу (карта пар), но я должен получить какую-то ошибку о >>

Компилятор умнее в наши дни?


person relaxxx    schedule 24.04.2011    source источник


Ответы (4)



Будьте осторожны, потому что ранее хороший код C++03 может не работать с компиляторами, поддерживающими эту функцию.

MyArray< MyArray<int, 16 >> 2>, 5 > arrayInst;

Это было бы исправлением:

MyArray< MyArray<int, (16 >> 2)>, 5 > arrayInst;
person CB Bailey    schedule 24.04.2011
comment
Нам всем было бы лучше, если бы они изначально использовали (T) вместо <T>. - person shuhalo; 21.09.2020

Этот код работает именно так, как я хочу (карта пар), но я должен получить некоторую ошибку о >>

C++0x исправил это. Так что если вы не получаете никаких ошибок с MSVS2010, то это неудивительно, так как MSVS2010 реализовал некоторые функции C++0x.

Кроме того, даже с C++03 многие компиляторы обрабатывают такие случаи, хотя Стандарт (2003) этого не требует.

person Nawaz    schedule 24.04.2011
comment
Фактически компилятору C++03, соответствующему требованиям, не разрешено реализовывать семантику C++0x для >>. Существуют допустимые конструкции C++03, которые могут сломаться при этом изменении. - person CB Bailey; 24.04.2011
comment
@Чарльз: Интересно. Но я хотел бы знать, какие допустимые конструкции С++ 03 могут быть нарушены этим изменением, и как тогда C++ 0x обрабатывает это? - person Nawaz; 24.04.2011
comment
@Наваз: например. выражения сдвига в константных выражениях для нетиповых параметров шаблона. Например. tmpl< tmpl<2 >> 1> > instance;. Обычно допустимый C++03 становится ошибкой компиляции в C++0x. Мне не удалось сконструировать ни одной ситуации, в которой это вызывало бы молчаливое изменение поведения. - person CB Bailey; 24.04.2011
comment
@Charles: Как тогда C++0x справляется с этим? Будет ли он интерпретировать >> в <2 >> 1> как оператор сдвига? - person Nawaz; 24.04.2011
comment
@Nawaz: Как я уже сказал, это ошибка компиляции. >> закрывает шаблон, оставляя бессмысленную последовательность токенов 1> > instance;, где требуется декларатор. - person CB Bailey; 24.04.2011
comment
@Charles: Другими словами, я могу сказать, что несколько допустимых вещей C++03 недействительны в C++0x, верно? - person Nawaz; 24.04.2011
comment
@Nawaz: я не уверен на 100%, что знаю, на чем ты ездишь. Вы хотите сделать более широкое обобщение? Есть a несколько вещей, которые допустимы для C++03 и недопустимы для C++0x. Не в последнюю очередь есть еще несколько ключевых слов, которые уже нельзя использовать в качестве обычных идентификаторов. - person CB Bailey; 24.04.2011
comment
@Charles: Вы хотите сделать более широкое обобщение?... что это значит? Мы обсуждаем какую-то философию? :-/ - person Nawaz; 24.04.2011
comment
@Nawaz: Вы сказали, что я могу сказать, что некоторые допустимые вещи C++03 недействительны в C++0x, верно? Я думал, что вы могли бы сказать это, но мы действительно затронули только один крайний случай и, вероятно, многие другие . - person CB Bailey; 24.04.2011

C++0x теперь поддерживает этот синтаксис без ошибок. Компиляторы уже начали реализовывать большинство этих функций, поэтому неудивительно, что последний компилятор Microsoft C++ поддерживает их.

person Joseph Lisee    schedule 24.04.2011