#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]), отличных от сокращающих преобразований