Это не полный ответ, хотя он слишком длинный, как комментарий. Я постараюсь предложить контрпример к вашим рассуждениям, и я готов смотреть вниз, потому что я далек от того, чтобы быть уверенным. В любом случае, давайте попробуем! : -)
Это следует из приведенного примера:
struct A {
A(int, int) { }
};
struct B {
B(A) { }
explicit B(int, int ) { }
};
int main() {
B paren({1, 2});
}
В этом случае утверждение {1, 2}
, по-видимому, дает два решения:
B(A)
, поскольку A(int, int)
не является явным и, следовательно, это разрешено, и это фактически первый кандидат B{B(A{1,2})}
(ну, позвольте мне оскорбить нотацию, чтобы дать вам представление и что я имею в виду), то есть {1,2}
позволяет построить временный объект B
, который используется сразу после аргумента для конструктора copy / move, и это снова разрешено, потому что задействованные конструкторы не являются явными . Последний объясняет второй и третий кандидаты.
Имеет ли смысл? Я готов удалить ответы до тех пор, пока вы объясните мне, что не так в моих рассуждениях. : -)