Почему шаблонное выражение параметра нетипа обрабатывает непоследовательный через компиляторы?

Почему бы не использовать

type.GetProperties(BindingFlags.Static)
9
задан Sumant 20 October 2009 в 16:29
поделиться

2 ответа

Для C ++ 03 действуют следующие правила:

После поиска имени (3.4) обнаруживает, что имя является именем шаблона, если за этим именем следует <, < всегда используется как начало списка аргументов-шаблонов и никогда как имя, за которым следует оператор «меньше». При разборе идентификатора шаблона первый невложенный > [сноска: A > , который включает идентификатор типа dynamic_cast , ] static_cast , reinterpret_cast или const_cast , или который включает аргументы шаблона последующего идентификатора шаблона, считается вложенным в целях этого описания. ] рассматривается как конец списка аргументов-шаблонов, а не как оператор "больше чем".

Таким образом, результат:

  X<(16 > 1)> a;       // works
  X<(int(16) > 1)> b;  // works
  X<(16 >> 1)> c;      // works
  X<(int(16) >> 1)> d; // works

  X<16 > 1> e;         // fails
  X<int(16) > 1> f;    // fails
  X<16 >> 1> g;        // works (">>" is not a ">" token)
  X<int(16) >> 1> h;   // works (">>" is not a ">" token). 

Однако, в C ++ 0x следующие правила

После того, как поиск имени (3.4) обнаруживает, что имя является именем шаблона, или что идентификатор-функции-оператора относится к набору перегруженных функций, любой член которых является шаблон функции, если за ним следует <, < всегда используется в качестве разделителя списка аргументов шаблона и никогда не используется как оператор «меньше». При разборе списка аргументов-шаблонов первое невложенное> [foot-note: A > включает идентификатор типа dynamic_cast , static_cast ], reinterpret_cast или const_cast , или который включает в себя аргументы шаблона последующего идентификатора шаблона, считается вложенным для целей этого описания.] Вместо конечного разделителя используется чем оператор "больше". По аналогии,

8
ответ дан 4 December 2019 в 21:10
поделиться

According to Stroustrup: "The first non-nested > terminates a template argument list. If a greater-than is needed, parentheses must be used."

Thus, the compilers that tolerate the second set of expressions do so incorrectly; the compiler that fails on X<(int(16) >> 1)> d; is buggy.

2
ответ дан 4 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: