Я предполагаю, что (неявные) неявные преобразования применяются при передаче параметров непигового шаблона. Например, для выражений типа std::array<int, 7>
должно быть преобразование из int
в std::size_t
. Однако рассмотрим следующий код:
template <bool>
void f() {
std::cout << "false\n";
}
template <>
void f<true>() {
std::cout << "true\n";
}
int main() {
f<1>();
f<4>();
f<0>();
}
Я ожидаю, что int
будет неявно преобразован в bool
здесь. Но поведение отличается от VC, GCC и clang.
В VC, true
, false
и false
печатаются, что для меня действительно странно.
В GCC, true
, true
и false
напечатаны, что я и ожидаю.
В то время как на clang код вообще не компилируется из-за оператора f<4>();
.
шаблон кандидата игнорируется: недопустимый явно заданный аргумент для параметра 1-го шаблона
Итак, что говорит об этом стандарт? Что такое правило неявного преобразования для параметров шаблона непигового типа?