Рассмотрим следующее:
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 ) фактически не жизнеспособна (в каноническом, не С++ - стандартном смысле), что предполагает сужение преобразования и, следовательно, быть плохо сформированным.
Почему сужение конверсий не рассматривается в процессе определения жизнеспособных кандидатов? Существуют ли другие ситуации, когда перегрузка считается неоднозначной, хотя только один кандидат является жизнеспособным?