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

#c #visual-studio-2010 #templates #bit-shift

#c #visual-studio-2010 #шаблоны #битовый сдвиг

Вопрос:

Я много читал о be aware >> как о завершении вложенного шаблона и >> как об операторе сдвига…

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

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

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

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

Ответ №1:

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

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

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

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

Комментарии:

1. Нам всем было бы лучше, если бы они использовались (T) вместо <T> в первую очередь.

Ответ №2:

MSVC 2010 поддерживает функцию C 0x в прямоугольных скобках

Ответ №3:

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

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

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

Комментарии:

1. На самом деле, соответствующему компилятору C 03 не разрешается реализовывать семантику C 0x для >> . Существуют допустимые конструкции C 03, которые могут нарушиться при этом изменении.

2. @Charles: Интересно. Но я хотел бы знать, какие допустимые конструкции C 03 могут быть нарушены этим изменением, и как C 0x тогда справляется с этим?

3. @Nawaz: Например, выражения сдвига в постоянных выражениях для параметров шаблона, отличных от типа. Например. tmpl< tmpl<2 >> 1> > instance; . Обычно допустимый C 03 становится ошибкой компиляции в C 0x. Мне не удалось создать ни одной ситуации, в которой это приводило бы к незаметному изменению поведения.

4. @Charles: Как тогда C 0x справляется с этим? Будет ли это интерпретироваться >> в <2 >> 1> качестве оператора сдвига?

5. @Nawaz: Как я уже указывал, это ошибка компиляции. >> закрывает шаблон, оставляя бессмысленную 1> > instance; последовательность токенов, где необходим декларатор.

Ответ №4:

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