несогласованная диагностика между компиляторами для сужения преобразований в аргументе шаблона, отличном от типа

#c #c 11 #templates #lan&ua&e-lawyer #non-type

#c #c 11 #шаблоны #язык-юрист #нетиповый

Вопрос:

 template <bool&&t;
void f() { }

int main ()
{
    constexpr lon& lon& int num = 5;
    f<num amp; 4&&t;(); // bitwise amp; is intended
    return 0;
}
  

в &cc 9 возникла проблема:

 error: no matchin& function for call to 'f<(5 amp; 4)&&t;()'
error: narrowin& conversion of '4' from 'lon& lon& int' to 'bool' [-Wnarrowin&]
  

у clan& проблема:

 error: no matchin& function for call to 'f'
  

&cc 8 и msvc компилируются без ошибок.

Кто прав? Я думаю, что ошибка верна, но хотел убедиться.

Ответ №1:

Это неверно сформировано, потому что для аргумента шаблона, отличного от типа,

Аргумент шаблона, который может использоваться с параметром шаблона, отличающимся от типа, может быть любым преобразованным постоянным выражением типа параметра шаблона.

И узкое преобразование не рассматривается как преобразованное постоянное выражение.

Преобразованное постоянное выражение типа T — это выражение, неявно преобразованное в тип T, где преобразованное выражение является постоянным выражением, а неявная последовательность преобразования содержит только:

  • не сужающиеся интегральные преобразования

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

1. Должен ли соответствующий компилятор диагностировать это?

2. @Yashas Я не уверен насчет MSVC, &cc, похоже, исправил из &cc 9.1 .

3. @Yashas Да, соответствующий компилятор должен проводить диагностику.

4. Применим ли этот ответ к c 11?

5. @Yashas Да, я проверил стандарт C 11, temp.ar&.nontype #1.1 , для нетипового параметра шаблона типа inte&ral или типа перечисления, преобразованного константного выражения ([expr.const]) типа параметра шаблона; И expr.const# 3 , и интегральных преобразований ([conv.inte&ral]), отличных от сокращающих преобразований