2016-06-30 3 views
1

Я новичок в C++ 11 и мне было интересно, как этот код работает внутри:станд :: initializer_list преобразования в конструкторах

class MyClass 
{ 
    public: 
     MyClass(int a, double b) { 
      cout << "ctor()" << endl; 
     } 
}; 

int main() 
{ 
    MyClass i1{4, 7}; 
    return 0; 
} 

Мое понимание нового списка инициализатора является то, что это класс std::initializer_list построенный специальным синтаксисом { .... } в коде. Итак, как этот экземпляр класса, созданный {4, 7}, внутренне преобразуется в форму, которая подходит конструктору до MyClass? Благодарю.

+0

Синтаксис '{... .} '* может * построить' std :: initializer_list' ... или он может делать другие вещи. – immibis

+0

@immibis Есть ли хорошая ссылка на это, что я могу прочитать? – hovo

+1

Возможно, обратитесь к пункту 6 «Эффективный современный C++» – Mine

ответ

1

Я думаю, что так происходит. Выдержки из: Explanation of list initialization at cppreference.com

Если на предыдущем этапе не производит матч, все конструкторы Т участвуют в разрешении перегрузки против набора аргументов, который состоит из элементов рамно-Init-листа, с тем ограничением, что допускаются только не суживающиеся преобразования. Если этот этап создает явный конструктор как наилучшее совпадение для инициализации списка копий, компиляция не выполняется (обратите внимание, что при простой инициализации копии явные конструкторы вообще не учитываются)