При той же записи, если убрать конструктор с листом, будет вызываться конструктор с int. Не очень укладывается в голове. Значит если лист есть, то будет всегда он вызываться?
Сергей,
При той же записи, если убрать конструктор с интами и добавить конструктор с double, то вызовется конструктор с double. Any(double n, double i) {}
Вы явно вызываете именно конструктор с initializer_list, вы же не удивляетесь, когда при наличии конструктора с double и int вызывается наиболее подходящий при соответствующем аргументе.
Фигурные скобки - это и есть одна из отличительных особенностей синтаксиса std::initializer_list https://en.cppreference.com/w/cpp/utility/initiali....
Сергей, компилятор выбирает наиболее подходящую перегрузку, если есть перегрузка точно подходящая по типам - то естественно она будет самая подходящая.
А вот когда такой перегрузки нет, то компилятор смотрит, а может ли он что-то скастовать, чтоб все-таки одна из перегрузок подошла.
Дмитрий Беляев, вот и я о том же. Я думал, что фигурные скобки это в том числе способ создать объект через конструктор, и что компилятор так же посмотрит на типы и выберет наиболее подходящий. Очевидно, что два инта более "узкий"/специализированный тип, чем initializer_list, у которого переменное число аргументов.
Но, видимо, в случае фигурных скобок приоритет у initializer_list.
А если его нет, то он декомпозирует фигурные скобки (initializer_list) на отдельные значения и ищет подходящий конструктор уже с отдельными значениями.
Сергей, фигурные скобки - это литерал для initializer_list
Знак равно при объявлении переменной - это не присваивание, а инициализация, то есть следующие 2 записи равносильны:
Any n = {1, 15};
Any n({1, 15});
То есть Вы вызываете конструктор Any и явно ему отдаете на вход один аргумент - initializer_list