#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 поддерживает это.