Выполняя некоторые ошибки, я наткнулся на следующее поведение инициализации, которое кажется мне странным: при инициализации для существующих конструкторов, похоже, были случаи, когда шаблоны для установки конструкторов игнорируются. Рассмотрим, например, следующую программу:Инициализация игнорирует шаблоны конструктора
#include <iostream>
template<class T>
struct A {
A() {};
template<class S>
A(const A<S>& a) {std::cout << "constructor template used for A" << std::endl;};
};
template<class T>
struct B{
B() {};
B(const B<int>& b) {std::cout << "constructor used for B" << std::endl;};
};
int main() {
A<int> a;
B<int> b;
A<int> aa = a;
B<int> bb = b;
A<double> aaa = a;
}
Для меня это производит вывод
constructor used for B
constructor template used for A
это означает, что он не использует конструктор в третьей строке основной. Почему нет? Есть ли причина? Или где-то мой синтаксис? Шаблон, похоже, работает, так как он успешно используется в последней строке.
Я знаю, что пример кажется слишком сложным, но различные упрощения привели к тому, что поведение, которое я хотел отобразить, исчезло. Кроме того: при инициализации будет использоваться специализированная специализация по шаблону, и именно так я предотвращаю это в результате ошибок (где это вызвало ошибки в первую очередь).
Прошу прощения, если мой вопрос отключен, я не программист, я не носитель языка, и это мой первый вопрос, пожалуйста, простите меня.
В строке 3 используется конструктор копирования, а не конструктор по умолчанию, за которым следует назначение. –
Когда вы спрашиваете: «Почему он делает X вместо Y», это помогает объяснить, почему вы думаете, что он должен делать Y. Для многих людей, делающих X, может быть настолько очевидно, что они никогда не думают о том, что Y может произойти. – PlasmaHH