Od początku. uniform initialization
to nie typ. W zależności od miejsca użycia {}
może oznaczać coś innego. W szczególności może to oznaczać list-initialization
std::vector
ma konstruktor, który przyjmuje std::initialization_list
i to on zostanie dopasowany w tym przykładzie.
W zadaniu pytają o to, czy {}
wprowadza reguły kolejności inicjalizacji składowych. I odpowiedź brzmi tak, wprowadza. W przeciwieństwie do wywołania funkcji porządek inicjalizacji elementów {}
jest zdeterminowany. Elementy są inicjowane w kolejności występowania (od lewej do prawej).
Warto zastanowić się nad czymś zupełnie innym. Mianowicie, "siła" {}
przy overload resolution
. I tutaj jest ciekawie. Dziad łapie wszystko co tylko możliwe. W tym przykładzie z zadania np. zostanie wywołany konstruktor vectora z std::initializer_list
, a nie np. konstruktor przyjmujący liczbę elementów i wartość tych elementów. Jeszcze ciekawiej jest gdy klasa ma konstruktor z std::initializer_list<X>
i np. konstruktor przyjmujący X i Y, gdzie Y nie ma implicit konwersji do X i spróbujemy utworzyć obiekt tej klasy w taki sposób foo f{1, "bar");
Ogólnie temat type deduction
to najciekawsza rzecz w C++ ; p