Рассмотрим следующее:
struct A {
A(float ) { }
A(int ) { }
};
int main() {
A{1.1}; // error: ambiguous
}
Это не скомпилируется с ошибкой о неоднозначной перегрузке A::A
. Оба кандидата считаются жизнеспособными, поскольку требование просто:
Во-вторых, для
F
, чтобы быть жизнеспособной функцией, для каждого аргумента будет существовать неявная последовательность преобразований (13.3.3.1), которая преобразует этот аргумент в соответствующий параметрF
.
Пока существует неявная последовательность преобразований от double
до int
, перегрузка A(int )
фактически не жизнеспособна (в каноническом, не С++ - стандартном смысле), что предполагает сужение преобразования и, следовательно, быть плохо сформированным.
Почему сужение конверсий не рассматривается в процессе определения жизнеспособных кандидатов? Существуют ли другие ситуации, когда перегрузка считается неоднозначной, хотя только один кандидат является жизнеспособным?