Почему в коде вызывается конструктор с initializer_list, а не с intами?

В C++, конструкторы с различными параметрами могут быть вызваны в зависимости от переданных аргументов. Ваш вопрос относится к случаю, когда конструктор с initializer_list вызывается вместо конструктора с int параметрами.

Рассмотрим пример кода для лучшего понимания ситуации:

#include <iostream>
#include <initializer_list>

class MyClass {
public:
    MyClass(int a, int b) {
        std::cout << "Constructor with int parameters" << std::endl;
    }

    MyClass(std::initializer_list<int> values) {
        std::cout << "Constructor with initializer_list" << std::endl;
    }
};

int main() {
    MyClass obj1(10, 20);  // вызывается конструктор с int параметрами
    MyClass obj2{10, 20}; // вызывается конструктор с initializer_list
    return 0;
}

Когда вы пишете MyClass obj1(10, 20);, компилятор ищет конструктор, который принимает два int параметра и вызывает его. В этом случае будет вызван конструктор MyClass(int a, int b), и вывод на экран будет Constructor with int parameters.

Но когда вы пишете MyClass obj2{10, 20};, дело обстоит несколько иначе. В этом случае компилятор пытается найти конструктор с параметром типа initializer_list. Компилятор находит конструктор MyClass(std::initializer_list<int> values), который совпадает с переданным списком и вызывает его. Вывод на экран будет Constructor with initializer_list.

Таким образом, различие в вызове конструкторов с int параметрами и initializer_list заключается в способе передачи аргументов. Если вы используете скобки {}, компилятор будет искать конструктор, который принимает initializer_list объект, а не отдельные аргументы. Если же вы используете круглые скобки (), компилятор будет искать конструктор, который принимает определенное количество аргументов определенного типа.