Я тестировал следующий код в Visual Studio, и он компилирует и печатает "A (double)".
#include <iostream>
#include <initializer_list>
struct A {
A(std::initializer_list<int>) { puts("initializer_list<int>"); } // (1)
A(std::initializer_list<float>) { puts("initializer_list<float>"); } // (2)
A(double) { puts("A(double)"); } // (3)
};
int main() {
A var{ 1.1 };
}
Однако как IntelliSense, так и http://ideone.com/ZS1Mcm не согласны, говоря, что более одного экземпляра конструктора "A:: A" соответствует списку аргументов ( что означает как конструкторы-инициализаторы-списки). Обратите внимание, что если удаляются либо (1), либо (2), код больше не компилируется, поскольку "преобразование из" double "в" float "требует сужения преобразования".
Это ошибка? Поведение кажется непоследовательным, но я вижу такое же поведение в VS13 и VS15, так что, может быть, есть больше?