Я смотрел, как реализована initializer_list
, поэтому я нашел раздел 18.9 стандарта и нашел простой достаточно перспективный интерфейс. Я подумал, что было бы поучительно сделать мою собственную версию, которую я назвал MyNamespace::InitializerList
и прецедентом:
template<class T>
class ArrayPrinter
{
public:
ArrayPrinter(MyNamespace::InitializerList<T> list)
{
for (auto i : list) cout << i << endl;
}
};
...
ArrayPrinter ap{ {1,2,3} };
Я с удивлением обнаружил, что это не сработало, и компилятор жаловался, что не может найти подходящего конструктора (он хотел дать мне 3 аргумента, но в разделе 18.9 описывается только конструктор по умолчанию).
После небольшого ворча я обнаружил, что для того, чтобы работать, мой класс должен был называться точно std::initializer_list
. Я мог бы также добавить псевдоним std::initializer_list
в MyNamespace
, но я не мог бы алиас MyNamespace::InitializerList
как std::initializer_list
.
Кажется, что это не действительно функция поскольку она зависит от стандартной библиотеки?
Главное в моем вопросе - почему так важно имя и какие три аргумента он пытался передать конструктору?